繁体   English   中英

导航抽屉后退按钮到主要片段

[英]Navigation drawer back button to primary fragment

阅读本文并搜索Android文档后,我放弃了,并决定在这里提问。 我正在尝试在Navigation Drawer设置一个后退按钮,以便该应用程序仅从Home片段关闭,而其他任何片段都将把我们带回到Home 例如,如果我们从Home片段开始并导航到导航抽屉中的其他片段,则单击“后退”按钮将进入Home片段,而如果从Home片段返回,则将退出应用程序。

我试图像这样实现它:

public void onNavigationDrawerItemSelected(int position) {   
    ...
    // If the next fragment is Home, clear the backstack.
    if (frag instanceof Home) {
        getSupportFragmentManager().popBackStack();
        fragmentManager.beginTransaction().replace(R.id.container, frag)
                .commit();
    }
    // If the backstack already contains a transaction, replace the current fragment
    else if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
        fragmentManager.beginTransaction().replace(R.id.container, frag)
                .commit();
    } 
    // If the backstack is empty, insert the Home -> Fragment transaction
    else {
        fragmentManager.beginTransaction().replace(R.id.container, frag)
                .addToBackStack("").commit();
    }
    ...
}

    ...

@Override
public void onBackPressed() {

    if (drawerLayout.isDrawerOpen(Gravity.START)) {
        drawerLayout.closeDrawer(Gravity.LEFT);
    } else {
        super.onBackPressed();
        // If returning back to Home fragment, restore action bar title.
        if (getSupportFragmentManager().getBackStackEntryCount() > 0)
            onSectionAttached(0);
    }
}

我附加的链接无法正常工作,并且我实现的方式不一致。 例如,如果我从“首页”导航到其他片段,然后返回首页(无需按“后退”按钮),则我的片段会彼此重叠。

我只是找到了一种使这项工作相当容易的方法,所以我决定将其发布在这里:

// Are we in Home fragment?
private boolean homeFrag = true;
...
@Override
public void onNavigationDrawerItemSelected(int position) {
    ...
    // Next fragment is Home?
    if (frag instanceof Home)
        homeFrag = true;
    else
        homeFrag = false;

    fragmentManager.beginTransaction().replace(R.id.container, frag)
            .commit();
    onSectionAttached(position);
}
...
@Override
public void onBackPressed() {
    // Close navigation drawer if open
    if (drawerLayout.isDrawerOpen(Gravity.START)) {
        drawerLayout.closeDrawer(Gravity.LEFT);
    } else {
        // If not in Home, move back to Home.
        if (!homeFrag) {
            onNavigationDrawerItemSelected(0);
        } else
            super.onBackPressed();
    }
}

我想听听您对这个解决方案的想法。

我认为您对super.onBackPressed()方法中的super.onBackPressed()的调用应该是else块中的最后一个代码。 原因是方法调用可能会影响getBackStackEntryCount()中的计数。 我认为这些电话已经太多了。

我已经为您提供了管理碎片和后退堆栈的方法。

/**
 * Change the current displayed fragment managing fragment backstack
 * 
 * @param frag the fragment to display
 * @param saveInBackstack true if you want the previous to be in backstack
 */
private void changeFragment(Fragment frag, boolean saveInBackstack) {
    String backStateName = ((Object) frag).getClass().getName();

    try {
        FragmentManager manager = getSupportFragmentManager();
        boolean fragmentPopped = manager.popBackStackImmediate(backStateName, 0);

        if (!fragmentPopped && manager.findFragmentByTag(backStateName) == null) { //fragment not in back stack, create it.
            FragmentTransaction transaction = manager.beginTransaction();
            transaction.replace(R.id.main_fragment_container, frag, ((Object) frag).getClass().getName());

            if (saveInBackstack) {
                Log.d(TAG, "Change Fragment : addToBackTack");
                transaction.addToBackStack(backStateName);
            } else {
                Log.d(TAG, "Change Fragment : NO addToBackTack");
            }

            transaction.commit();
        } else {
            Log.d(TAG, "Change Fragment : nothing to do");
            // custom effect if fragment is already instanciated
        }
    } catch (IllegalStateException exception) {
        Log.e(TAG, "Unable to commit fragment, could be activity as been killed in background. " + exception.toString());
    }
}

同样在您的活动中,覆盖onBackPressed:

@Override
public void onBackPressed() {
    int fragments = getFragmentManager().getBackStackEntryCount();
    if (fragments == 1) {
        finish();
    }
    super.onBackPressed();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM