在选项卡之间传递数据

Posted

技术标签:

【中文标题】在选项卡之间传递数据【英文标题】:Pass data between tabs 【发布时间】:2013-07-31 04:05:32 【问题描述】:

我有一个带有 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(),也尝试过探索 mTab​​Host 的功能。没有什么能得到它们。

您能否建议一种方法来执行此操作或建议一种替代方法?

我试过用这个...

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

但如果我的添加标签很好,我不知道如何使用这个R.id.fragmentid

mTabHost.addTab(mTabHost.newTabSpec("classA").setIndicator("Class A"),
                ClassA.class, null);

有人帮帮我吗?

【问题讨论】:

【参考方案1】:

将 Activity 中的片段定义为公开。然后在每个 Fragment 中您还引用 Activity。

在您的活动中:

public ClassAFragment aFragment;
...
// during initialization:
aFragment = new ClassAFragment();
// or you get it from your TabHost
FragmentManager fm = getFragmentManager();
aFragment = fm.findFragmentByTag("ClassA");
aFragment.mActivity = this;
// same with B and C

在你的片段中:

public MainActivity mActivity;
...
// in Fragment C
String newText = mActivity.aFragment.editText.getText().toString() + mActivity.bFragment.editText.getText().toString();
textView.setText(newText); 

【讨论】:

你能给我举个例子吗?假设我们有 3 个片段 .. Tab 1 ==> FragmentTab1 Tab 2 ==> FragmentTab2 Tab 3 ==> FragmentTab3 在 Tab1 你有一个 EditText “Number 1” 在 Tab2 你有一个 EditText “Number 2” 在 Tab3 应该显示两个数字之和当你这样做的时候? 我已经更新了我在 Fragment C 中填充 textView 的示例,其中包含两个其他 Fragment 的 editText 的串联字符串。 我试过使用 FragmentManager fm = getFragmentManager(); aFragment = fm.findFragmentByTag("ClassA"); aFragment.mActivity = 这个;但是不工作....aFragment 为空...如何初始化他? 我解决了在片段中添加活动引用的问题。不是这样:getSupportFragmentManager().findFragmentById(R.id.article_fragment);类似于:getChildFragmentManager().findFragmentByTab("MyTab");

以上是关于在选项卡之间传递数据的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual Basic 2010 中的表单中的选项卡之间传递值

片段和活动之间没有传递值

使用导航栏按钮项和核心数据在视图控制器之间传递日期

数据从父片段传递到选项卡片段(子) - Android

将数据从一个选项卡控制器快速传递到另一个选项卡控制器

将数据从一个设计选项卡传递到另一个选项卡