FragmentTabHost&片段 - 如何在标签之间传递数据?

时间:2013-02-11 01:04:43

标签: android android-fragments android-tabhost android-fragmentactivity

我有一个MainActivity(FragmentActivity),它有一个FragmentTabHost。

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都是片段(android.support.v4.app.Fragment)。

我需要在Fragments上传递数据(和调用方法)。如何获得每个片段的引用,如下所示:

ClassA mClassAFragment = ???;

我尝试过使用getSupportFragmentManager()。findFragmentByTag(),我也尝试过探索mTabHost的功能。没有什么可以得到它们。

你能建议一种方法来做这个或提出另一种方法吗?

3 个答案:

答案 0 :(得分: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
            ...
        }
    }
}

答案 1 :(得分: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();

答案 2 :(得分:1)

这可以通过 android.support.v4.app.FragmentTabHost.addTab(TabSpec,Class,Bundle args 的第三个参数来完成, 然后可以通过 android.support.v4.app.Fragment.getArguments()

检索args
public class Tab1Fragment extends BaseFragment {

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

}