0

我有一个带有碎片的导航抽屉,并且在旋转设备并单击菜单后,我的应用程序崩溃。 我的上主要活动的代码是:我旋转设备后,应用程序崩溃并单击菜单

public class MainActivity extends FragmentActivity { 


    private DrawerLayout mDrawerLayout; 
    ImageView home; 
    Fragment fragment = null; 
    TextView appname; 
    ExpandableListView expListView; 
    HashMap<String, List<String>> listDataChild; 
    ExpandableListAdapter listAdapter; 
    List<String> listDataHeader; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     String fontPath = "neue.ttf"; 
     setContentView(R.layout.activity_main); 
     home = (ImageView)findViewById(R.id.home); 
     home.setOnClickListener(homeOnclickListener); 
     appname = (TextView)findViewById(R.id.appname); 
     Typeface tf = Typeface.createFromAsset(this.getAssets(), fontPath); 
     appname.setTypeface(tf); 

     if(savedInstanceState == null){ 
      setUpDrawer(); 
     } 
    } 


    private void setUpDrawer() { 
     mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
     mDrawerLayout.setScrimColor(getResources().getColor(android.R.color.transparent)); 
     mDrawerLayout.setDrawerListener(mDrawerListener); 
     expListView = (ExpandableListView) findViewById(R.id.lvExp); 
     prepareListData(); 
     listAdapter = new ExpandableListAdapter(this, listDataHeader, listDataChild); 
     // setting list adapter 
     expListView.setAdapter(listAdapter); 
     fragment = new Inicio(); 
     getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, fragment).commit(); 
     mDrawerLayout.closeDrawer(expListView); 

     expListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() { 
      @Override 
      public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { 
       switch (groupPosition) { 
        case 0: 
         switch (childPosition) { 
          case 0: 
           fragment = new enunciados_definiciones(); 
           break; 
          case 1: 
           fragment = new enunciados_ayuda_victima(); 
           break; 
          case 2: 
           fragment = new enunciados_abordaje(); 
           break; 
          case 3: 
           fragment = new transmision_enfermedades(); 
           break; 
          default: 
           fragment = new Inicio(); 
           break; 
         } 
         break; 

        case 1: 
         switch (childPosition) { 
          case 0: 
           fragment = new Inicio(); 
           break; 
          case 1: 
           fragment = new Inicio(); 
           break; 
          case 2: 
           fragment = new Inicio(); 
           break; 
          default: 
           break; 
         } 
         break; 

        case 2: 
         switch (childPosition) { 
          case 0: 
           fragment = new Inicio(); 
           break; 
          case 1: 
           fragment = new Inicio(); 
           break; 
          case 2: 
           fragment = new Inicio(); 
           break; 
          default: 
           break; 
         } 
         break; 

        default: 
         break; 
       } 
       getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, fragment).commit(); 
       mDrawerLayout.closeDrawer(expListView); 
       return false; 
      } 
     }); 
    } 

我的代码继续这样的logcat错误(行:140)其上的下一个代码段:

View.OnClickListener homeOnclickListener = new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if(mDrawerLayout.isDrawerOpen(expListView)){ 
       mDrawerLayout.closeDrawer(expListView); 
      }else{ 
       mDrawerLayout.openDrawer(expListView); 
      } 
     } 
    }; 

我的logcat:

FATAL EXCEPTION: main 
java.lang.NullPointerException 
at com.eiusweb.primerosauxilios.MainActivity$2.onClick(MainActivity.java:140) 
at android.view.View.performClick(View.java:4162) 
at android.view.View$PerformClick.run(View.java:17082) 
at android.os.Handler.handleCallback(Handler.java:615) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:4867) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774) 
at dalvik.system.NativeStart.main(Native Method) 

谢谢

回答

0

好吧,我知道了,不得不修改一些东西,但它的工作。 剔除if null中的setUpDrawer(),就像Gabe Sechan的建议一样。并将其更改为

setUpDrawer(); 
     if (savedInstanceState == null) { getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, new Inicio()).commit(); 
     } 

我也删除fragment = new Inicio();和所有的getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, fragment).commit();

并更新所有的情况下case 0:fragment = new enunciados_definiciones(); break; 感谢

0

如果您的savedInstanceState为null,则只调用setupDrawer。这意味着在重新创建循环活动时不会调用它。但是,这是您设置mDrawerLayout值的地方。所以当onClick在循环后被调用时,mDrawerLayout为空。要解决这个问题,你需要在两种情况下设置mDrawerLayout的值。

其实我不知道为什么当savedInstanceState不为null时,你没有调用setupDrawer,它看起来很错误。

+0

我理解,但如果我不使用空,当我旋转屏幕该应用程序“重新启动” –

+0

它无论如何这样做。你必须说明这一点。研究如何处理Android上的旋转。或者使用清单中的configChanges语句关闭该功能 –

0

移动

mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
expListView = (ExpandableListView) findViewById(R.id.lvExp); 

setUpDrawer()onCreate()if block之前。

+0

它工作正常,不会崩溃,但现在旋转后不显示抽屉内容。 –

相关问题