【问题标题】:Unable to find the fragment by tag when Back Button is pressed按下后退按钮时无法按标签找到片段
【发布时间】:2017-07-04 23:37:20
【问题描述】:

我有两个片段,即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 打开片段并按下后退按钮时,这似乎出错了,对应的条件没有执行,所以,我无法再次打开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) 解决了这个问题,但这似乎不是一个好方法,因为它会重新加载我的整个MainActivity

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

谢谢。

【问题讨论】:

    标签: android android-fragments navigation-drawer back


    【解决方案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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多