【问题标题】:FragmentTabHost & Fragments - How do I pass data between tabs?FragmentTabHost & Fragments - 如何在选项卡之间传递数据?
【发布时间】:2013-02-11 01:04:43
【问题描述】:

我有一个带有 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 的功能。没有什么能得到它们。

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

【问题讨论】:

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


    【解决方案1】:

    在这里。为了解决这个问题,我在 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
                ...
            }
        }
    }
    

    【讨论】:

    • 很棒的建议。我认为这样做是一个很好的方法。
    • 我认为您应该对片段类进行.equals() 比较,而不是直接使用== 比较器。
    • 或者instanceof会更好:'fragment instanceof ClassA'
    • 我希望它只会第一次调用
    • 你是怎么解决这个问题的,请解释一下。我正在使用,但它在附加片段后第一次调用,不再调用
    【解决方案2】:

    你可以像这样得到你的片段:

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

    【讨论】:

    • 不错。不幸的是 findFragmentById() 不适用于 FragmentTabHost 因为片段仅在它们是当前选定的选项卡时才会创建。 IE。 ClassB 和 ClassC 在我选择它们之前不存在。我会将您的回复标记为答案,因为我认为它非常接近并且非常有帮助。我将提供我自己的答案以获取更多信息。
    【解决方案3】:

    这可以通过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());
        // ...
    }
    

    }

    【讨论】:

    • 不幸的是,不是。这显然是初衷,但 getArguments() 总是在那里返回 null。真可惜……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-31
    • 2016-07-24
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    • 1970-01-01
    相关资源
    最近更新 更多