打开片段时带有 onItemClick 的 NullPointerException

NullPointerException with onItemClick when opening a fragment

我正在尝试实现导航抽屉 (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.onItemClick(MainActivity.java:117)

111行就是这一行

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

更多详情:

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

EDIT 我已经应用了 Rohit 的建议并且不再出现任何错误。但是布局没有改变。有什么问题吗?

EDIT@ 我想通了...首先没有将片段添加到 activity...所以没有什么可以替换的呃 :) 谢谢大家!

替换

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

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

同样改变案例1

编辑

替换

Fragments.ONE.getFragment()

Fragments.TWO.getFragment()

万一0

您的问题是 getFragments() 方法 returns 空指针。如果您查看 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;
                    }