2016-12-04 7 views
1

これは実行可能かどうかはわかりませんが、複数の他のクラスに対して1つのメソッドを持つ集中クラスを持つことができるように、フラグメントクラスをパラメータとして渡そうとしています。ここで パラメータとしてフラグメントクラスを渡す

は私が書くしようとしている方法ですが、私はこの方法で「フラグメントクラスの引数を」欠けている:

public void onStartFragment(??? ???, Fragment fragment, int containerViewId) { 


    fragment = (???) getChildFragmentManager(). 
      findFragmentByTag(???.class.getName()); 

    if (fragment == null) { 
     fragment = ???.newInstance(); 
    } 
    FragmentTransaction childFragmentTransaction = getChildFragmentManager().beginTransaction(); 
    childFragmentTransaction.replace(containerViewId, 
      fragment, ???.class.getName()) 
      .addToBackStack(null).commit(); 
} 

私の目標は、開始するために使用することができる1つの方法を持っていることです任意の断片。私は以来、

+0

'???。newInstance()' ...ジェネリックの使用を計画している場合、 '???。class'はほぼ常に' Fragment'になるので難しいでしょう –

+0

また、 'fragment ='は'フラグメントフラグメント'をオーバーライドするので、これは確かにあなたが望むものではありませんか? –

+0

私は '???。newInstance()'を 'Fragment'クラスの代わりに渡されたフラグメントクラスにしようとしています。 –

答えて

1

を得ることができますクラス名をタグ(およびバックスタックのエントリ名)として使用する予定で、フラグメントではなくクラス名を渡すだけです。

次に、Fragment.instantiate(context, className)を使用してクラスのインスタンスを作成します。

public void onStartFragment(String className, int containerViewId) { 

    FragmentManager manager = getChildFragmentManager(); 
    Fragment fragment = manager.findFragmentByTag(className); 
    if (fragment == null) { 
     fragment = Fragment.instantiate(context, className); 
     // fragment is a className instance now 
    } 

    manager.beginTransaction() 
       .replace(containerViewId, fragment, className) 
       .addToBackStack(className) 
       .commit(); 
} 

この方法は、希望する動作に応じてさらに細かく調整できますが、その点が分かります。また、Class<? extends Fragment>を渡すこともできます。私は必要なフラグメントのクラスのメソッドを使用

public class FragmentSeparateClass extends Fragment {

public void onStartFragment(Context context, FragmentManager fragmentManager, String className, int containerViewId) { 

    Fragment fragment = fragmentManager.findFragmentByTag(className); 

    if (fragment == null) { 
     fragment = Fragment.instantiate(context, className); 
    } 
    fragmentManager.beginTransaction() 
      .replace(containerViewId, fragment, className) 
      .addToBackStack(className) 
      .commit(); 
} 
その後

}

+0

これは魅力的です!別のメソッドにいくつかのパラメータを追加しました!あなたが別の答えで始めたものを完成させるためにいくつかの行を追加しました。素晴らしい答え、ありがとう! –

1

メソッドのオーバーロードを使用すると、これらのメソッドを呼び出す必要がwhereever

public void onStartFragment(FragmentManger manager, Fragment fragment, String tag, int containerViewId) { 

    // could check for tag here 

    manager 
     .beginTransaction() 
     .replace(containerViewId, fragment, tag) 
     .addToBackStack(null).commit(); 
} 

public void onStartFragment(Fragment fragment, String tag, int containerViewId) { 
    onStartFragment(
     getFragmentManager() // Or child, if you are in a Fragment already 
     fragment, tag, containerViewId); 
} 

public void onStartFragment(Fragment fragment, int containerViewId) { 
    onStartFragment(fragment, null, containerViewId); 
} 

場所、つまり

MyFragment frag = new MyFragment(); 
onStartFragment(frag, frag.class.getName(), R.id.container); // for example 

ここであなたを助けるかもしれないが、これはおそらく、そのメソッドの外部で処理する必要がありますあなたの場合はわからない、あなたは確実に???.class.getName()

fragment = (???) getChildFragmentManager(). 
     findFragmentByTag(???.class.getName()); 

if (fragment == null) { 
    fragment = ???.newInstance(); 
} 
+0

あなたのお返事ありがとうございます。あなたの答えが私の質問を解決するとは思わない。私はすでに必要なパラメータを渡していますが、欠落しているのは** Fragmentクラスのパラメータ**です。これまで、 'Object' **クラス**を使用する必要があるかもしれないと思っています。なぜなら、javaクラス**をスーパークラス化しているからです。しかし、わかりません。 –

+0

'Fragment'と' Fragment class 'の意味を理解できません –

+0

文字列タグが必要です。フラグメントクラス名である必要はありません –

0

@natario答えに引き続き、私は別のクラスで開始フラグメントの方法を使用しました例えば、

  fragmentSeperateCLass.onStartFragment(getContext(), getChildFragmentManager(), FirstChildFragment.class.getName(), 
        R.id.firstChildFragmentLayout); 
     } 
関連する問題