我正在创建一个我使用片段的应用。我想从另一个片段返回前一个片段而不重新加载前一个片段。
转到下一个片段的代码:
Fragment newFragment;
android.support.v4.app.FragmentManager manager = ((AppCompatActivity) context).getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
newFragment = new Inner_details();
transaction.replace(R.id.content_data, newFragment);
transaction.addToBackStack("fragment6");
transaction.commit();
转到上一个片段的代码
FragmentManager fm = getActivity().getSupportFragmentManager();
fm.popBackStack ("fragment6", FragmentManager.POP_BACK_STACK_INCLUSIVE);
答案 0 :(得分:1)
您正在替换您的片段,因此之前的片段将不再提供其内容,您可能会尝试通过"添加"而不是"替换":
transaction.add(R.id.content_data, newFragment);
答案 1 :(得分:0)
您应该使用 addToBackStack 方法。
FragmentManager为每个Activity保留所有Fragment事务的记录。如果使用得当,这允许用户点击设备的后退按钮以删除以前添加的片段(与后退按钮删除活动的方式不同)。只需在每个应记录的FragmentTransaction上调用addToBackstack:
// Create the transaction
FragmentTransaction fts = getSupportFragmentManager().beginTransaction();
// Replace the content of the container
fts.replace(R.id.flContainer, new FirstFragment());
// Append this transaction to the backstack
fts.addToBackStack("optional tag");
// Commit the changes
fts.commit();
以编程方式,您也可以随时通过经理从后台堆栈中弹出:
FragmentManager fragmentManager = getSupportFragmentManager();
if (fragmentManager.getBackStackEntryCount() > 0) {
fragmentManager.popBackStack();
}
通过这种方法,我们可以轻松地保留哪些片段在屏幕上动态显示的历史记录,并允许用户轻松导航到以前的片段。
这是一个Senario: 当我们在登录片段和用户点击backbutton home片段时应该 加载:
当您单击按钮时,在Framelyout中替换片段登录:
fragmentManager.beginTransaction().replace(R.id.your_placeholder, new Fragment_Login()).addToBackStack("login").commit();
当你单击应用程序中的后退按钮时,如果最后一个片段(最后一个backStack中的片段)是登录,请检查最后一个片段是什么?在Framelayout上替换片段主页:
public void onBackPressed() {
int index = fragmentManager.getBackStackEntryCount() - 1;
String tag = fragmentManager.getBackStackEntryAt(index).getName();
// Fragment fragment = fragmentManager.findFragmentByTag(tag);
switch (tag) {
case "login":
fragmentManager.beginTransaction().replace(R.id.your_placeholder, new HomePage_Fragment()).addToBackStack("home").commit();
break;
}
了解更多信息和示例查看此网站:
https://www.survivingwithandroid.com/2013/04/android-fragment-transaction.html
答案 2 :(得分:0)
尝试
第一个是存储所有碎片
transaction.addToBackStack(null);
第二个将所有碎片移入堆栈
getActivity().getSupportFragmentManager().popBackStack();
答案 3 :(得分:0)
使用Add()而不是replace()来打开先前的片段而无需重新加载。
fragmentManager.beginTransaction().add(R.id.contentPanel, fm)
.addToBackStack(null).commit();
,并且在处理回压的方法上也做了一些更改:
1)在片段上->
view.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) {
//((MainActivity) getActivity()).finish();
if(getFragmentManager().getBackStackEntryCount() > 0) {
getFragmentManager().popBackStack();
}else {
((MainActivity) getActivity()).finish();
}
return true;
}
return false;
}
});
2)在活动->
@Override
public void onBackPressed()
{
if(getFragmentManager().getBackStackEntryCount() > 0)
getFragmentManager().popBackStack();
else
super.onBackPressed();
}