5

私は、FragmentTabHostを持つMainActivity(FragmentActivity)を持っています。FragmentTabHost&Fragments - タブ間でデータを渡すにはどうすればいいですか?

public class FragmentTabs extends FragmentActivity { 
    private FragmentTabHost mTabHost; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.fragment_tabs); 
     mTabHost = (FragmentTabHost)findViewById(android.R.id.tabhost); 
     mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent); 

     mTabHost.addTab(mTabHost.newTabSpec("classA").setIndicator("Class A"), 
      ClassA.class, null); 
     mTabHost.addTab(mTabHost.newTabSpec("classB").setIndicator("Class B"), 
      ClassB.class, null); 
     mTabHost.addTab(mTabHost.newTabSpec("classC").setIndicator("Class C"), 
      ClassC.class, null); 
    } 
} 

A級、ClassBのとクラスCは、すべてのフラグメント(android.support.v4.app.Fragment)です。

私はフラグメント(とメソッド)を渡す必要があります。 。(

私はgetSupportFragmentManagerを使用してみました
ClassA mClassAFragment = ???; 

()findFragmentByTag)と私はまたmTabHostの能力を探求しようとしました:どのように私はこのように、フラグメントのそれぞれの参照を取得することができます。それを得ることはできません。

これを行う方法や代替方法を提案する方法を提案できますか?

答えて

11

ここには、この問題を解決するために、私は私のFragmentActivityでonAttachFragmentメソッドをオーバーロードしています

public class FragmentTabs extends FragmentActivity { 
    private FragmentTabHost mTabHost; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     ... 
    } 

    @Override 
    public void onAttachFragment(Fragment fragment) { 
    super.onAttachFragment(fragment); 

    if (fragment.getClass() == ClassA.class) { 
     ClassA mClassAFragment = (ClassA)fragment 
      ... 
     } 
    } 
} 
+0

素晴らしいアドバイス。私はこれをそうするのはかなり良いアプローチだと思う。 – Siggy

+1

私は、 '=='直接コンパイラではなく、フラグメントクラスの '.equals()'比較を行うべきだと思います。 – alexgophermix

+2

また、intanceofはさらに良いでしょう: 'フラグメントinstanceof ClassA' – kgautron

3

あなたはこのようなあなたのフラグメントを得ることができます:あなたは新しいトランザクションを作成し、バンドルを介してデータを送信し、このアプローチに従うことができますフラグメントにデータを送信するために

YourFragment frag = (YourFragment) getSupportFragmentManager() 
        .findFragmentById(R.id.fragmentid)); 

Bundle arguments = new Bundle(); 
arguments.putString("some id string", "your data"); 
YourFragment fragment = new YourFragment(); 
fragment.setArguments(arguments); 
getSupportFragmentManager().beginTransaction().add(R.id.fragmentid, fragment).commit(); 
+8

悪くない。残念ながら、フラグメントは現在選択されているタブの場合にのみ作成されるため、findFragmentById()はFragmentTabHostでは機能しません。私。 ClassBとClassCは選択するまで存在しません。私はそれがかなり近いと思うので、私はあなたの応答を答えとしてマークし、それは非常に有用です。私は、自分自身の答えを提供するつもりです。 –

1

これはandroid.support.v4.app.FragmentTabHost.addTab(TabSpec、クラス、バンドル引数の3番目の引数によって達成することができます、 は次にargsがandroid.support.v4.app.Fragment.getArguments()

public class Tab1Fragment extends BaseFragment { 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    // do something with the arguments 
    Log.i("DEBUG", "" + getArguments()); 
    // ... 
} 

}

を介して取得することができ210
+0

残念ながら、そうではありません。これは明らかに元の意図ですが、 'getArguments()'は常にnullを返します。恥、本当に... –