2011-09-07 15 views
5

Android互換パッケージを使用していましたが、次の問題が発生しました。アプリケーションで内部静的クラスとしてFragmentを作成し、それは次のようなエラー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

あなたのような内部クラスの断片がある場合:FragmentActivityはそれはそれはそれを処理する具体的なクラスからそれを呼び出すことはありませんフラグメントを再開しようとしたとき

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から、そしてあなたの内部クラスの断片がプライベートであれば活動はonSaveState、onRestoreStateへの参照を持っていない、などの初期化... public

privateは私のためにそれを修正!

更新:

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

(フラグメントが完全に破壊された)保存された状態からFragmentを復元しようとしたときinstantiate方法はnewInstance()呼び出すを見てください。

メソッドは、クラスに一般にアクセス可能である必要があります。したがって、内部クラスとして定義する場合、適切な場合はpublicstaticである必要があります。

今後の質問をクリアしたいと考えています。

+1

答えを受け入れることは決して遅くはありません私はそれを忘れてしまいました... – Necronet

+0

私は理解できません:なぜですか断片が公開されることが重要ですか?それは何か例外を引き起こすでしょうか?もしそうなら、その場合は?フラグメントを使用する唯一のクラスがアクティビティである場合、プライベートな静的クラスとして設定してみませんか?私がviewPagerのためにだけフラグメントを使用する場合、プライベートとしてそれを設定するのは大丈夫ですか? –

+1

@androiddeveloperまあ実際には 'Fragment'のライフサイクルをアクティビティではなく維持する' FragmentManager'です。 ソースコードをチェックする必要がありますが、フラグメントを作成する必要があるときにフラグメントマネージャがインスタンス化するものなので、すべてのフラグメントが空のコンストラクタをチェックされます。したがって、フラグメントが 'FragmentManager'これはもちろん不可能です。 (私はそれがhttps://developer.android.com/reference/java/lang/Class.html#newInstance()を呼び出すと思います) –

関連する問題