2017-07-04 13 views
0
は、私は、それぞれの項目が NavigationView

は、タグによってフラグメントを見つけることができません

てクリックを押したとき、私は二つの断片、すなわちFoodFragmentWishlistFragmentこれら二つが開かれてきた私が直面してる問題がある

とき、Iナビゲーションアイテムを押して、それらに対応するフラグメントが開き、すべて正常に動作しますが、私がBackボタンを押すと、MainActivityのonBackPressed()メソッドが呼び出され、私が書いたフラグメントの最初の状態でのみ機能します。ここで

は私のコードです:あなたがコードで参照し、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(); 
     } 
    } 

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()メソッドです方法。ここで、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(); 
     } 
    } 

それはWishFragmentFoodFragmentではなくて、今動作しているようですが、結果として、私は再びFoodFragmentを開くことができたではなく、 WishFragment。私は多くのウェブサイトでこの問題を探しましたが、私は正しい答えを得ることができません。

フラグメントにview.setOnKeyListener(//calling the MainActivity by KeyEvents)を追加して解決しましたが、これはもう一度MainActivity全体をリロードするため、良い方法ではないようです。

私はどこが間違っているのか分かりません。これを行うにはより良い方法を提案してください。

ありがとうございます。

答えて

1

WishFragmentが開いていると、あなたはこれがNullPointerExceptionがスロー

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

バックボタンを押してください。あなたは、これが

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

のおかげで、あなたの場合はelse文を変更解決するために、すべてのNullPointerException

をキャッチされているので

だから、常にsuper.onBackPressed()を行います...これは、問題を解決しました –

関連する問題