android - 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();
}
}
}
解决方案
您的 fragmentX 在onBackPressed
被调用时被销毁。您需要检查 backstack 的当前片段,如果它是 FragmentX 的实例,则将其隐藏(并且不要弹出 backstack),否则执行您的代码。
推荐阅读
- python-3.x - ValueError:年份超出使用 matplotlib.pyplot 的范围
- javascript - 将整数传递给查询时,NodeJS MySQL返回空数组
- javascript - 在本地地理编码器中访问函数外部变量
- android-studio - 如何在资源布局 xml 文件的组件树中启用/显示设备屏幕?
- ios - 如何在 wkwebview 中打开“window.open”
- java - 我如何测试保存方法?
- jquery - 为什么 select2 没有用最新数据填充控件?
- javascript - Terser 不提供缩小文件
- python - 将字典中的键与字符串匹配。而不是循环字典或字符串单词中的键
- c# - 实数的四舍五入