打开片段时使用onItemClick的NullPointerException

时间:2015-01-09 19:34:56

标签: android android-layout android-fragments android-appcompat drawerlayout

我正在尝试实现导航抽屉(based on this tutorial)。

当点击抽屉中的某个项目时,我想打开一个片段。这是我的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行是这一行

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

更多详情:

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

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

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

编辑@ 我想出来......首先没有将片段添加到活动中......所以没有什么可以取代duh :) 谢谢大家!

2 个答案:

答案 0 :(得分:0)

您的问题是getFragments()方法,它返回空指针。如果您查看Android API文档,那么该方法就没有一个单词。如果官方API中没有提到某些内容,请不要指望它会起作用xD

修改 在第二种情况下,您希望:

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

而不是

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

编辑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;
                    }

答案 1 :(得分:-1)

替换

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

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

同样改变案例1

修改

替换

Fragments.ONE.getFragment()

Fragments.TWO.getFragment()

案例0