2016-04-30 3 views
0

TheParentという親DialogFragmentと、TheParentを拡張するTheChildという子フラグメントがあります。子供で親フラグメントを拡張する子フラグメントを作成するときにnewInstance()を呼び出す

親で

public static TheParent newInstance(int myInt) { 
    Bundle args = new Bundle(); 
    TheParent fragment = new TheParent(); 
    args.putInt(ARGUMENT_MYINT, myInt); 
    fragment.setArguments(args); 
    return fragment; 
} 

、その後:

はしかし、私は私が試したことだった、私はTheChildをインスタンス化していていてもTheParentにいくつかの変数を初期化できるようにする必要があります。

public static TheChild newInstance(int myInt) { 
    return super.newInstance(myInt); 
} 

しかし、これは静的なコンテキストのために私が好きではありません。

TheChildでnewInstance()を呼び出し、親のnewInstance()を呼び出す正しい方法は何ですか?

答えて

1

TheParentの新しいインスタンスのような静的メソッドは "クラス"メソッドです。したがって、super.newInstanceを呼び出す代わりに、TheParent.newInstance(...)を呼び出す必要があります。静的メソッドを呼び出す方法は、クラス名を使用することだけです。それが役に立てば幸い。 TheChildのnewInstanceメソッドには、 "TheChild"型の戻り値があります。これは、TheParentインスタンスを返すことは不可能であることを意味し、TheChildのコードを から「return super.newInstance()」を「TheParent.newInstance」に変更するとすぐに表示されるコンパイル時エラーになります。 ()」と表示されます。

+0

親が設定するために引数を必要とする場合、どのようにして子を適切に宣言/設定するのですか?親がmyIntを必要とする –

+0

intをとるプライベートコンストラクタの親クラスに初期化コードを入れてください。その後、TheParent.newInstanceからそのコンストラクタを呼び出し、myIntに渡します。 TheChildクラスでは、intを受け取り、先ほど作成した親コンストラクターであるsuper(myInt)を呼び出すコンストラクターが必要です。TheChild.newInstanceでは、TheChildでこのコンストラクターを呼び出してmyIntを渡します。この方法では、子と親の両方が親初期化コードを実行し、TheChildで作成されたフラグメントはTheChildであり、TheParentではありません。 –

0

これは私が子供のクラス内のすべてのロジックを繰り返すことから保つために何をしたかである:もちろん

public static TheChild newInstance(int myInt) { 
    TheChild fragment = new TheChild(); 
    fragment.setArguments(TheParent.newInstance(myInt).getArguments()); 
    return fragment; 
} 

、この解決策は一時的にTheParentの2番目のインスタンスを作成します。

関連する問題