2011-09-07 29 views
5

我一直在使用Android兼容性包,但我遇到了以下問題,似乎每當我創建一個片段作爲我的應用程序內部靜態類,並嘗試啓動該活動它顯示以下錯誤Android兼容性包作爲內部靜態類的片段

android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment org.wr.CreditCardHolderActivity.CreditCardHolderFragment: make sure class name exists, is public, and has an empty constructor that is public 

而當我分離片段和活動一切工作順利,任何人都知道爲什麼?我該如何解決它?

謝謝!

+0

如何將碎片加載到容器中?通過佈局XML或代碼?我沒有嘗試過前者,但後者與靜態內部片段類沒有任何問題。順便說一句我正在使用compat lib的v1。 – PJL

+0

我有一個包含片段的佈局,顯然包含標記以及內部類的名稱。 – Necronet

+1

你看過API演示中的FragmentLayoutSupport示例嗎?它通過以下方式引用靜態內部片段類:** PJL

回答

7

如果你有一個像內部類片段:

public class SomethingFragment extends Fragment {  
    public static final class TypeFragment extends BaseFragment 
    { 

    public static Fragment newInstance() 
    { 
     return new TypeFragment(); 
    } 

    private View mRootView; 
    private ListView mListView; 

    /** 
    * @see android.support.v4.app.Fragment#onCreateView(android.view.LayoutInflater, 
    *  android.view.ViewGroup, android.os.Bundle) 
    */ 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) 
    { 
     mRootView = inflater.inflate(R.layout.fragment_category_list, container, false); 
     mListView = (ListView) mRootView.findViewById(R.id.fragment_listview); 
     return mRootView; 
    } 
    } 
} 

確保您的預選賽是公共當FragmentActivity試圖重新開始片段不從具體類調用它,它就會進行處理從抽象的FragmentActivity,如果你的內部類的片段是私人的活動沒有參考onSaveState,onRestoreState,初始化等。

privatepublic修復它給我!

更新:

看一看https://android.googlesource.com/platform/frameworks/support/+/refs/heads/master/v4/java/android/support/v4/app/Fragment.java

instantiate方法調用newInstance()試圖從已保存的狀態(其中片段被完全破壞)恢復Fragment時。

newInstance方法需要的類是可公開訪問的,因此,當被定義爲一個內部類,這意味着它必須是publicstatic酌情。

希望能夠解決一些未來的問題。

+1

是從來沒有遲到接受答案謝謝我忘了它做... – Necronet

+0

我不明白:爲什麼是碎片是否公開是重要的?它會導致任何異常嗎?如果是的話,在哪些情況下?如果使用片段的唯一類是活動,爲什麼不將它設置爲私有靜態類?如果我只使用viewPager的片段,可以將其設置爲私有? –

+1

@androiddeveloper那麼它實際上是'FragmentManager',它保持'Fragment'的生命週期而不是活動。 我需要檢查源代碼,但所有片段都檢查公共空構造函數,因爲這是片段管理器在需要創建片段時將實例化的內容,所以如果片段與「FragmentManager」不在同一個範圍內這當然是不可能的。 (在猜測我認爲它會調用https://developer.android.com/reference/java/lang/Class.html#newInstance()) –