【问题标题】:Switching between fragments in same container在同一容器中的片段之间切换
【发布时间】:2014-08-12 08:52:55
【问题描述】:

我的活动中有两个按钮。当我单击 button1 时,我会显示一个片段,当我单击 button2 时,我会在同一个容器中显示另一个片段。对于每个片段,我都设置了一个标签,这样如果再次单击该按钮,我将只替换容器中的片段。问题是当我再次单击第二个按钮时,findFragmentByTag 返回“null”并再次加载片段。 这是我正在使用的代码

    Button button1= (Button) findViewById(R.id.button1);
    button1.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            MyFragment myFragment = (MyFragment) fragmentManager.findFragmentByTag("button1");
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            if(myFragment==null){
                MyFragment fragment = new MyFragment();
                fragmentTransaction.add(R.id.container, fragment, "button1");                   
                fragmentTransaction.commit();
            }else{                  
                fragmentTransaction.replace(R.id.container, myFragment, "button1");                 
                fragmentTransaction.commit();
            }

        }
    });
    Button button2= (Button) findViewById(R.id.button2);
    button2.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            MyFragment myFragment = (MyFragment) fragmentManager.findFragmentByTag("button2");// always return null
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            if(myFragment==null){
                MyFragment fragment = new MyFragment();
                fragmentTransaction.add(R.id.container, fragment, "button2");                   
                fragmentTransaction.commit();
            }else{
                fragmentTransaction.replace(R.id.container, myFragment, "button2");                 
                fragmentTransaction.commit();
            }
        }
    });

在上面的代码中fragmentManager.findFragmentByTag("button2")总是返回null。 谁能让我知道如何让这个工作。我看过其他帖子,但找不到任何解决方案。

TIA, 维杰拉杰

【问题讨论】:

    标签: android android-activity android-fragments


    【解决方案1】:

    在调用新事务之前,您必须执行待处理事务。试试这个:

    getSupportFragmentManager().executePendingTransactions()
    

    编辑

    用 FragmentTransaction 替换 Fragment 后,您必须将其添加到 backstack。

    fragmentTransaction.addToBackStack(button1);
    

    【讨论】:

    • 我在调用 fragmentManager.beginTransaction() 之前添加了这个,但它仍然不起作用
    • 啊我现在明白了,替换后你不发送事务addToBackStack(button1)。干杯!
    • 我应该在哪里将它添加到后台?在我的 button1 或 button2 的 onclicklistener ??
    • 对于每一个。我已经更新了我的 awnser,一般解释一下,如果你替换一个 Fragment,你必须将它添加到 backstack,这意味着对于每个事务替换,你必须将替换的 Fragment 添加到 backstack。
    • addtoBackStack 不是我想要的......我正在使用片段事务的隐藏和显示方法在两个片段之间切换
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-11
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多