NavigationView
てクリックを押したとき、私は二つの断片、すなわちFoodFragment
とWishlistFragment
これら二つが開かれてきた私が直面してる問題がある
とき、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();
}
}
それはWishFragment
とFoodFragment
ではなくて、今動作しているようですが、結果として、私は再びFoodFragment
を開くことができたではなく、 WishFragment
。私は多くのウェブサイトでこの問題を探しましたが、私は正しい答えを得ることができません。
フラグメントにview.setOnKeyListener(//calling the MainActivity by KeyEvents)
を追加して解決しましたが、これはもう一度MainActivity
全体をリロードするため、良い方法ではないようです。
私はどこが間違っているのか分かりません。これを行うにはより良い方法を提案してください。
ありがとうございます。
のおかげで、あなたの場合はelse文を変更解決するために、すべての
NullPointerException
をキャッチされているので
だから、常に
super.onBackPressed()
を行います...これは、問題を解決しました –