我正在尝试在Android Fragments中执行以下用例。我有2个片段。 片段A - >片段B 当用户在片段B中执行某些操作时,我希望如下所示具有后端堆栈 片段A - >片段C.因此,当用户按下时,我希望用户返回片段A。
我试过以下
mFragmentManager.popBackStackImmediate();
FragmentTransaction fragmentTransaction = fMgr.beginTransaction()
.replace(R.id.base, Fragment_C, "1")
.addToBackStack(null)
.commitAllowingStateLoss();
这里的问题是我可以在显示片段C之前的短时间内看到片段A
如果我执行以下操作
mFragmentManager.popBackStackImmediate();
FragmentTransaction fragmentTransaction = fMgr.beginTransaction()
.replace(R.id.base, Fragment_C, "1")
.addToBackStack(null)
.commitNowAllowingStateLoss();
我收到错误
此事务已添加到后台堆栈
如果我这样做,我可以让Fragment C出现但是
mFragmentManager.popBackStackImmediate();
FragmentTransaction fragmentTransaction = fMgr.beginTransaction()
.replace(R.id.base, Fragment_C, "1")
.commitNowAllowingStateLoss();
这很有效,我没有看到片段A并看到片段C,但是后退按钮将用户从应用程序中取出。那么,是否有可能我们可以弹出片段的后栈,然后将另一个片段添加到后栈,而不显示片段A AND 后退按钮将用户带回片段A
答案 0 :(得分:0)
这是将片段添加到片段或片段中的适配器的简便方法...
使片段管理器保持静态。假设此活动称为仪表板。
static FragmentManager support;
别忘了在onCreate中初始化它。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_dashboard);
support = getSupportFragmentManager();
在适配器或片段中定义新片段。
users_item_fragment dialog = new users_item_fragment();
//also, let's add some data...
Bundle args = new Bundle();
args.putString("device", devicesList.get(position));
使用以下方法轻松地在任意位置添加片段
//pick an easily remembered tag
public void replace(Fragment fragment, String tag){
FragmentManager man = dashboard.support;
FragmentTransaction fragt = man.beginTransaction();
if(!fragment.isAdded()) {
dashboard.lastTag = dashboard.fragtag;//not needed, but helpful w/ backpresses
fragt.add(R.id.fragment_container, fragment, tag)
.hide(man.findFragmentByTag(fragtag)).commit();
dashboard.fragtag = dashboard.tag;//not needed, but helpful w/ backpresses
}
if(fragment.isAdded() && fragment.isHidden()) {
dashboard.lastTag = dashboard.fragtag;//not needed, but helpful w/ backpresses
fragt.show(fragment);
fragt.hide(man.findFragmentByTag(fragtag)).commit();
dashboard.fragtag = dashboard.tag;//not needed, but helpful w/ backpresses
}
}
要使backpress正常工作来实现此目的,请将其添加到您的主要活动的onBackPress方法中:
@Override
public void onBackPressed() {
FragmentManager man = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = man.beginTransaction();
fragmentTransaction.hide(getSupportFragmentManager().findFragmentByTag(fragtag))
.show(getSupportFragmentManager().findFragmentByTag(lastTag)).commit();
fragtag = lastTag;// holds the last fragment
}
}
很容易在这里看到逻辑,并很容易使用此操作来操纵回按事件。