2015-09-27 92 views
0

我有滑块菜单displayview方法为:的Android片段从导航抽屉切换导致应用程序退出

private void displayView(int position) { 
       // update the main content by replacing fragments 
       Fragment fragment = null; 
       switch (position) { 
        case 0: 
         fragment = new HomeFragment(); 

        FragmentManager fm = getSupportFragmentManager(); 
        String tag = fragment.getTag(); // instance method of a to get a tag 

        FragmentTransaction ft = fm.beginTransaction(); 

        ft.replace(R.id.frame_container, fragment, tag); 
        ft.addToBackStack(tag); 
        ft.commit(); 

        default: 
         break; 
       } 

       if (fragment != null) { 
        FragmentManager fragmentManager = getFragmentManager(); 
        fragmentManager.beginTransaction() 
          .replace(R.id.frame_container, fragment).commit(); 

        // update selected item and title, then close the drawer 
        drawerListView.setItemChecked(position, true); 
        drawerListView.setSelection(position); 
        setTitle(navMenuTitles[position]); 
        drawer.closeDrawer(drawerListView); 
       } else { 
        // error in creating fragment 
        Log.e("MainActivity", "Error in creating fragment"); 
       } 
      } 

我有一个名为home_fragment其代码后面是HomeFragment.java

当我点击该片段片段首先它工作正常,但点击索引0旁边的菜单时,出现如下错误:

Attempt to write to field 'int android.support.v4.app.Fragment.mNextAnim' on a null object reference 

我在做什么错?谢谢。

这是我遇到的错误:

case OP_REMOVE: { 
        Fragment f = op.fragment; 
        f.mNextAnim = exitAnim; 
        mManager.removeFragment(f, transition, transitionStyle); 
       } break; 

此代码存在于BackStackRecord.java

+0

你在哪里使用mNextAnim? – freddieptf

回答

1

你不应该叫container.removeAllViewsInLayout()

当您拨打FragmentTransaction.replace()时,FragmentManager将处理容器上的所有视图操作,包括删除当前片段视图。您可能会收到错误消息,因为FragmentManager预计片段视图位于容器中,但您已将其删除。

所有你需要的是这样的:

 private void displayView(int position) { 
      // update the main content by replacing fragments 
      Fragment fragment = null; 
      switch (position) { 
       case 0: 
        fragment = new HomeFragment(); 
        break; 
       case 1: 
        // set fragment to other nav target 
        fragment = ... 
        break; 
       . 
       . 
       . 
       default: 
        break; 
      } 

      if (fragment != null) { 
       FragmentManager fragmentManager = getSupportFragmentManager(); 
       fragmentManager.beginTransaction() 
         .replace(R.id.frame_container, fragment).commit(); 

       // update selected item and title, then close the drawer 
       drawerListView.setItemChecked(position, true); 
       drawerListView.setSelection(position); 
       setTitle(navMenuTitles[position]); 
       drawer.closeDrawer(drawerListView); 
      } else { 
       // error in creating fragment 
       Log.e("MainActivity", "Error in creating fragment"); 
      } 
     } 

而且我注意到你正在使用getFragmentManager()。请检查您的课程进口并确保您有正确的电话。

  • 如果HomeFragment延伸android.app.Fragment,请使用getFragmentManager()
  • 如果HomeFragment延伸android.support.v4.app.Fragment,请使用getSupportFragmentManager()
+0

现在我用这个:'fragment = new HomeFragment(); FragmentManager fm = getSupportFragmentManager(); String tag = fragment.getTag(); //获取标签的实例方法 FragmentTransaction ft = fm.beginTransaction(); ft.replace(R.id.frame_container,fragment,tag); ft.addToBackStack(tag); ftp.mit();'同样的错误。 –

+0

你也不需要那个。对'replace()'的一次调用将处理删除当前片段并添加新片段,请参阅我的更新答案。 –

+0

谢谢。我会试试这个,向它解释逻辑给我,一旦我通过就会接受。 –