按下后退按钮时无法按标签找到片段

时间:2017-07-04 15:16:26

标签: android android-fragments navigation-drawer back

我有两个片段,FoodFragmentWishlistFragment当我按NavigationView

中的各个项目点击时,这两个片段会被打开

我面临的问题是,当我按下导航项时,与它们对应的片段打开,一切正常但是当我按下后退按钮时,MainActivity的onBackPressed()方法是被调用,它只适用于我写过的片段的第一个条件。

这是我的代码:

public boolean onNavigationItemSelected(@NonNull MenuItem item) {

        int id = item.getItemId();
        mFragmentTransaction = getSupportFragmentManager().beginTransaction();

        if (id == R.id.food) {

            if(newFragment == null) {
                newFragment = FoodFragment.newInstance("food", "fragment");
                mFragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
                mFragmentTransaction.replace(R.id.appBar, newFragment, "FoodFragment").addToBackStack("FoodFragment").commit();
            }

        }else if(id == R.id.wishlist){
            if(wishFragment == null){
                wishFragment = WishlistFragment.newInstance("wish", "fragment");
                mFragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
                mFragmentTransaction.replace(R.id.appBar, wishFragment, "WishFragment").addToBackStack("WishFragment").commit();
            }
        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }

这是onBackPressed()方法:

public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        try {
            if (drawer.isDrawerOpen(GravityCompat.START)) {
                drawer.closeDrawer(GravityCompat.START);
            }  else if(getSupportFragmentManager().findFragmentByTag("WishFragment").isVisible()){
                getSupportFragmentManager().popBackStack();
                wishFragment = null;
            }else if (getSupportFragmentManager().findFragmentByTag("FoodFragment").isVisible()) {
                getSupportFragmentManager().popBackStack();
                newFragment = null;
            }else {
                super.onBackPressed();
            }
        }catch (NullPointerException npe){
            super.onBackPressed();
        }
    }

我已经在代码中看到并为每个片段添加了标签,并通过onBackPressed()方法处理它们。在这里,当我打开WishFragment并按下后退按钮时,一切都被清除,因此我可以通过按下与之对应的导航项再次打开WishFragment。但是,当我打开片段并按下后退按钮时,FoodFragment的情况似乎出错了,与之对应的条件没有执行,因此,我无法打开{{1}再次。

但是,如果我改变FoodFragment中条件的顺序,就像这样:

onBackPressed()

现在似乎可以使用public void onBackPressed() { DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); try { if (drawer.isDrawerOpen(GravityCompat.START)) { drawer.closeDrawer(GravityCompat.START); }else if (getSupportFragmentManager().findFragmentByTag("FoodFragment").isVisible()) { getSupportFragmentManager().popBackStack(); newFragment = null; } else if(getSupportFragmentManager().findFragmentByTag("WishFragment").isVisible()){ getSupportFragmentManager().popBackStack(); wishFragment = null; }else { super.onBackPressed(); } }catch (NullPointerException npe){ super.onBackPressed(); } } 但不能使用FoodFragment,因此我可以再次打开WishFragment而不是FoodFragment。我在很多网站上都搜索过这个问题但是,我找不到正确的答案。

我已经通过为片段添加WishFragment来解决这个问题但是,这似乎是一种很好的方法,因为它会重新加载我的整个view.setOnKeyListener(//calling the MainActivity by KeyEvents)。< / p>

我不知道我在哪里做错了。请建议我更好的方法来做到这一点。

谢谢。

1 个答案:

答案 0 :(得分:1)

WishFragment打开并按后退按钮

getSupportFragmentManager().findFragmentByTag("FoodFragment").isVisible()

这会抛出NullPointerException。

所以它始终会super.onBackPressed(),因为你正在捕捉所有NullPointerException

要解决此问题,请将if else语句更改为

if (drawer.isDrawerOpen(GravityCompat.START)) {
    drawer.closeDrawer(GravityCompat.START);
} else if (getSupportFragmentManager().findFragmentByTag("FoodFragment") != null && getSupportFragmentManager().findFragmentByTag("FoodFragment").isVisible()) {
    getSupportFragmentManager().popBackStack();
    newFragment = null;
} else if(getSupportFragmentManager().findFragmentByTag("WishFragment") != null && getSupportFragmentManager().findFragmentByTag("WishFragment").isVisible()){
    getSupportFragmentManager().popBackStack();
    wishFragment = null;
} else { 
    super.onBackPressed();
}