5

FragmentTabHost を持つ MainActivity (FragmentActivity) があります。

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);
    }
}

ClassA、ClassB、ClassC はすべてFragment (android.support.v4.app.Fragment) です。

フラグメントでデータを渡す (およびメソッドを呼び出す) 必要があります。次のように、各フラグメントの参照を取得するにはどうすればよいですか。

ClassA mClassAFragment = ???;

getSupportFragmentManager().findFragmentByTag() を使用してみました。また、mTabHost の機能を調べてみました。それらを取得することはできません。

これを行う方法を提案したり、別のアプローチを提案したりできますか?

4

3 に答える 3

11

OPはこちら。この問題を解決するために、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
            ...
        }
    }
}
于 2013-02-11T02:36:42.913 に答える
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();
于 2013-02-11T01:42:50.727 に答える
2

これは、 android.support.v4.app.FragmentTabHost.addTab(TabSpec, Class, Bundle args )の 3 番目の引数によって実現できます。その後、引数は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());
    // ...
}

}

于 2014-10-16T11:06:55.603 に答える