为什么我在某些语句中的onBackPressed上得到空对象引用(NullPointerException),而在另一些语句中没有?(导航抽屉-Android)
我正在管理导航抽屉活动中的片段,我正在处理onBackPressed方法,以便有一个逻辑“backpress”按钮。该方法的代码如下所示:为什么我在某些语句中的onBackPressed上得到空对象引用(NullPointerException),而在另一些语句中没有?(导航抽屉-Android),android,android-fragments,nullpointerexception,navigation-drawer,onbackpressed,Android,Android Fragments,Nullpointerexception,Navigation Drawer,Onbackpressed,我正在管理导航抽屉活动中的片段,我正在处理onBackPressed方法,以便有一个逻辑“backpress”按钮。该方法的代码如下所示: @Override public void onBackPressed() { DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); if (drawer.isDrawerOpen(GravityCompat.START)) { drawe
@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);
}
}
这应该是有意义的,因为我有另一种方法在替换片段时存储标记:
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”片段,然后按back按钮,它将毫无问题地工作,因此它将转到主片段(Inicio)。但由于某些原因,我无法理解,它在其他情况下(实习医生、考官等)不能正常工作。我在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
我真的非常感谢对这一点的任何澄清以及解决这一问题的适当解决办法。如有必要,请告诉我任何问题。将每个If条件替换为以下条件
Fragment fragment = getSupportFragmentManager().findFragmentByTag("Aprender");
if(fragment != null){
fragment.isVisible();
do your stuff
}
由于查找的片段已从内存中删除,所以每次使用findFragmentByTag方法搜索片段时,都会得到空指针。非常感谢,伙计。@Ignacio Valdés ZamudioWelcome。