导航到上一个片段而不重新加载它

时间:2017-06-27 07:22:59

标签: android android-fragments

我正在创建一个我使用片段的应用。我想从另一个片段返回前一个片段而不重新加载前一个片段。

转到下一个片段的代码:

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);

4 个答案:

答案 0 :(得分:1)

您正在替换您的片段,因此之前的片段将不再提供其内容,您可能会尝试通过"添加"而不是"替换":

 transaction.add(R.id.content_data, newFragment);

答案 1 :(得分:0)

您应该使用 addToBackStack 方法。

管理片段Backstack

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();
}