0

我试图实现导航抽屉(based on this tutorial)。打开片段时出现NullPointerException与onItemClick

当抽屉中的物品被点击时,我想打开一个碎片。下面是我的一些MainActivity.java代码

public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       int editedPosition = position + 1; 
       Toast.makeText(MainActivity.this, "You selected item " + editedPosition, Toast.LENGTH_SHORT).show(); 


       switch(position){ 
        case 0: 
         Log.d("SWITCH", "Case 0"); 
         if (!(getSupportFragmentManager().getFragments().get(0) instanceof NewLogFragment)) { 
          getSupportFragmentManager().beginTransaction() 
            .replace(R.id.contentFrame, Fragment 
              .instantiate(MainActivity.this, Fragments.ONE.getFragment())) 
            .commit(); 
         } 
         break; 
        case 1: 
         if (!(getSupportFragmentManager().getFragments().get(0) instanceof LogFragment)) { 
          getSupportFragmentManager().beginTransaction() 
            .replace(R.id.contentFrame, Fragment 
              .instantiate(MainActivity.this, Fragments.ONE.getFragment())) 
            .commit(); 
         } 
         break; 
       } 
       mDrawerLayout.closeDrawer(mDrawerList); 
      } 
     }); 

这里是我的activity_main.xml中

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    tools:context=".MainActivity"> 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     android:background="@color/primary" 
     app:popupTheme="@style/Theme.AppCompat" 
     app:theme="@style/ToolbarTheme" /> 



    <!-- Main layout --> 
    <android.support.v4.widget.DrawerLayout 
     android:id="@+id/drawer" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <FrameLayout 
      android:id="@+id/contentFrame" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"></FrameLayout> 


     <!-- Nav drawer --> 
     <ListView 
      android:id="@android:id/list" 
      android:layout_width="305dp" 
      android:layout_height="match_parent" 
      android:layout_gravity="start" 
      android:background="@android:color/white" /> 
    </android.support.v4.widget.DrawerLayout> 


</LinearLayout> 

而且,这里是我的Fragments.java

public enum Fragments { 

ONE(NewLogFragment.class),TWO(LogFragment.class); 

final Class<? extends Fragment> fragment; 

private Fragments(Class<? extends Fragment> fragment) { 
    this.fragment = fragment; 
} 

public String getFragment() { 
    return fragment.getName(); 
}} 

当我跑,我得到

java.lang.NullPointerException at sleeping_vityaz.fivethreeone_trainer.MainActivity$1.onItemClick(MainActivity.java:117) 

111行是th是线

`if (!(getSupportFragmentManager().getFragments().get(0) instanceof LogFragment)) {` 

更多细节:

  • MainActivity扩展ActionBarActivity
  • 我的片段延伸Fragment(android.support.v4.app.Fragment)到处

那么,为什么我得到这个空指针异常?

编辑我应用了Rohit的建议,不再有任何错误。但是布局不会改变。什么可能是错的?

编辑@我想通了......没有在活动中首先添加片段......所以没有什么东西可以代替哦:) 谢谢大家!

+0

可能重复[什么是空指针异常,以及如何解决它?](http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception-and-我怎么办 - 修复它) – Simon 2015-01-09 19:54:18

回答

-1

替换

if (!(getSupportFragmentManager().getFragments().get(0) instanceof NewLogFragment)) 

if (!(getSupportFragmentManager().findFragmentById(R.id.contentFrame) instanceof NewLogFragment)) 

类似地改变壳体1太

EDIT

替换

Fragments.ONE.getFragment() 

Fragments.TWO.getFragment() 

万一0

+0

这工作,但布局并没有改变。没有错误。任何想法可能是错的? – naja 2015-01-09 19:43:02

+0

任何评论为什么downvoted? – Rohit5k2 2015-01-09 20:01:20

+0

我没有。您的建议有助于摆脱错误。 – naja 2015-01-09 20:02:12

0

您的问题是getFragments()方法,它返回空指针。如果您查看Android API文档,则没有关于该方法的单词。如果事情没有在官方的API所提到的,不要指望它会成功的xD

编辑: 而在第二种情况下你想有:

instantiate(MainActivity.this, Fragments.TWO.getFragment())) 

,而不是

instantiate(MainActivity.this, Fragments.ONE.getFragment())) 

EDIT 2 好吧,让我们用这样的开关尝试:

switch(position){ 
         case 0: 
          Log.d("SWITCH", "Case 0"); 
           getSupportFragmentManager().beginTransaction() 
             .replace(R.id.contentFrame, Fragment 
               .instantiate(MainActivity.this, Fragments.ONE.getFragment())) 
             .commit(); 
          break; 
         case 1: 
           getSupportFragmentManager().beginTransaction() 
             .replace(R.id.contentFrame, Fragment 
               .instantiate(MainActivity.this, Fragments.TWO.getFragment())) 
             .commit(); 
          break; 
        } 
+0

谢谢。 Rohit的建议摆脱了空指针异常,但现在我的布局不会改变onItemClick。有任何想法吗? – naja 2015-01-09 20:00:00

+0

:(删除if语句也没有帮助 – naja 2015-01-09 20:12:17

相关问题