私はナビゲーション・ドロワー・アクティビティでフラグメントを管理しています。論理バック・ボタンを持つためにonBackPressedメソッドを処理しています。メソッドのコードはこれです:これが原因それに意味を持たなければならない一部のステートメントではonBackPressedではnullオブジェクト参照(NullPointerException)が返され、別のステートメントでは返されないのはなぜですか? (Navigation Drawer - Android)
@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
}
else if(getSupportFragmentManager().findFragmentByTag("Aprender").isVisible()){
getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, new Inicio()).commit();
}
else if(getSupportFragmentManager().findFragmentByTag("Practicar").isVisible()){
getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, new Inicio()).commit();
}
else if(getSupportFragmentManager().findFragmentByTag("Campo").isVisible()){
getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, new Inicio()).commit();
}
else if(getSupportFragmentManager().findFragmentByTag("Examinar").isVisible()){
getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, new Inicio()).commit();
}
else if(getSupportFragmentManager().findFragmentByTag("Materias").isVisible()){
getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, new Inicio()).commit();
}
else if(getSupportFragmentManager().findFragmentByTag("Utilidades").isVisible()){
getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, new Inicio()).commit();
}
else if(getSupportFragmentManager().findFragmentByTag("Info").isVisible()){
getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, new Inicio()).commit();
}
else {
moveTaskToBack(true);
}
}
I持っている断片を交換する際、タグを格納し、別の方法:
private void displaySelectedScreen(int itemId) {
//creating fragment object
Fragment fragment = null;
//initializing the fragment object which is selected
switch (itemId) {
case R.id.nav_inicio:
fragment = new Inicio();
break;
case R.id.nav_aprender:
fragment = new Aprender();
break;
case R.id.nav_practicar:
fragment = new Practicar();
break;
case R.id.nav_examinar:
fragment = new Examinar();
break;
case R.id.nav_materias:
fragment = new Materias();
break;
case R.id.nav_utilidades:
fragment = new Utilidades();
break;
case R.id.nav_info:
fragment = new Info();
break;
}
//replacing the fragment
if (fragment != null) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, fragment, fragment.getClass().getCanonicalName().substring(44));
ft.commit();
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
}
fragment.getClassを書くの理由() .getCanonicalName()。substring(44)は、クラス名(たとえば "Aprender")と等しいタグを設定する方法であり、前にある文字の数であるため44ですパッケージ名(com.myname.myapp。)にあり、実際には "Aprender"フラグメントで正しく動作します。
アプリを実行すると問題が発生します。メイン・フラグメント(Inicio)から「Aprender」フラグメントに入り、「戻る」ボタンを押すと、何の問題もないので、メイン・フラグメント(Inicio)に移動します。しかし何らかの理由で私が理解できない、それは他のケース(Practicar、Examinarなど)とは適切に動作しません。私はアクティブにlogcatを走り、これは誤りです:
E/InputEventSender: Exception dispatching finished signal.
E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback
E/MessageQueue-JNI: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.support.v4.app.Fragment.isVisible()' on a null object reference
私はこれまで任意の明確化と、この状況を解決するための適切な解決策を感謝本当にだろう。必要な場合は、私に質問をさせてください。
を使用してフラグメントを検索するたびに作るフラグメントとしてNULLポインタを得ていたが、非常に多くの仲間をありがとうございます。 –
@IgnacioValdésZamudioウェルカム。 –