首页 > 解决方案 > Android添加了后按后无法显示的片段

问题描述

我有3个片段fragmentA,fragmentB,fragmentC,默认情况下在创建活动上添加以保持它的实例,然后我有另一个片段fragmentX要添加到片段容器上,单击按钮时带有backStack,fragmentX显示在添加但是当我需要再次显示它时它不起作用。

public class MainActivity extends ActivityBaseClass {

private Fragment fragmentA;
private Fragment fragmentB;
private Fragment fragmentC;
private Fragment fragmentX;

@BindView(R.id.btn_show_fragmentx)
Button mBtnShowFragmentX;
@BindView(R.id.tab_layout)
TabLayout mTab;

private FragmentTransaction transaction;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ButterKnife.bind(this);

    fragmentA = FragmentA.newInstance();
    fragmentB = FragmentB.newInstance();
    fragmentC = FragmentC.newInstance();

    transaction = getSupportFragmentManager().beginTransaction();
    transaction.add(R.id.fragment_container, fragmentA, "A");
    transaction.add(R.id.fragment_container, fragmentB, "B");
    transaction.add(R.id.fragment_container, fragmentC, "C");
    transaction.commit();


    mTab.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            transaction = getSupportFragmentManager().beginTransaction();
            switch (tab.getPosition()) {
                case 0:
                    transaction.show(fragmentA);
                    transaction.hide(fragmentB);
                    transaction.hide(fragmentC);
                    break;
                case 1:
                    transaction.show(fragmentB);
                    transaction.hide(fragmentA);
                    transaction.hide(fragmentC);
                    break;
                case 2:
                    transaction.show(fragmentC);
                    transaction.hide(fragmentA);
                    transaction.hide(fragmentB);
                    break;

            }
            transaction.commit();
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });
}

@OnClick(R.id.btn_show_fragmentx)
public void showFragmentX() {
    if (fragmentX == null) {
        fragmentX = FragmentX.newInstance();
        transaction = getSupportFragmentManager().beginTransaction();
        transaction.add(R.id.fragment_container, fragmentX, "X");
        transaction.addToBackStack("X");
        transaction.commit();
    } else {
        transaction = getSupportFragmentManager().beginTransaction();
        transaction.show(fragmentX);
        transaction.addToBackStack("X");
        transaction.commit();
    }
}

@Override
public void onBackPressed() {
    if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
        Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
        transaction = getSupportFragmentManager().beginTransaction();
        transaction.hide(fragment);
        transaction.commit();

         getSupportFragmentManager().popBackStack();
    } else {
        super.onBackPressed();
    }
}

}

标签: androidfragmentfragmenttransactionfragment-backstack

解决方案


您的 fragmentX 在onBackPressed被调用时被销毁。您需要检查 backstack 的当前片段,如果它是 FragmentX 的实例,则将其隐藏(并且不要弹出 backstack),否则执行您的代码。


推荐阅读