设置列表视图适配器 (DrawerLayout) 时出现 NullPointerException
NullPointerException when setting listview adapter (DrawerLayout)
我有一个片段布局,它是抽屉,看起来像这样:
fragment_overview.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- The main content view -->
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffe887" />
<!-- The navigation drawer -->
<ListView android:id="@+id/left_drawer"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:choiceMode="multipleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="0dp"
android:background="#111"/>
</android.support.v4.widget.DrawerLayout>
以及该片段的 java class:
OverviewFragment.java
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_overview, container, false);
mlistOptions = getResources().getStringArray(R.array.list_options);
mDrawerLayout = (DrawerLayout) getActivity().findViewById(R.id.drawer_layout);
mDrawerList = (ListView) getActivity().findViewById(R.id.left_drawer);
// Set the adapter for the list view
mDrawerList.setAdapter(new ArrayAdapter<String>(getActivity(),
R.layout.simple_list_item_1, mlistOptions));
mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
return root;
}
在资源文件夹中使用此代码:
<string-array name="list_options">
<item>Ship</item>
<item>Map</item>
<item>Mail</item>
<item>Settings</item>
<item>Logout</item>
</string-array>
这是一个列表项:
simple_list_item_1.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="15dp"
android:textColor="@android:color/black"
android:textStyle="italic">
然而,当 setAdapter 方法在 java class 中运行时,它会生成此错误:
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference
该方法调用实际上可能出了什么问题?它是一个片段,所以我们需要 getActivity 作为第一个参数,布局文件只是对一个简单文件的引用,选项列表只是资源文件夹中的数组列表。什么可以为空?
提前致谢!
试试这个,而不是使用 getActivity 使用 root 是因为你的组件现在在根视图中,所以你会膨胀你的布局。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_overview, null);
mlistOptions = getResources().getStringArray(R.array.list_options);
mDrawerLayout = (DrawerLayout) root.findViewById(R.id.drawer_layout);
mDrawerList = (ListView) root.findViewById(R.id.left_drawer);
// Set the adapter for the list view
mDrawerList.setAdapter(new ArrayAdapter<String>(getActivity(),
R.layout.simple_list_item_1, mlistOptions));
mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
return root;
}
您应该在主 activity 中填充您的抽屉列表。将此代码放入 activity 的 onCreate 方法中。
然后在您的片段的 onCreateView 中,您应该膨胀另一个将放入您的(主要 activity 的)FrameLayout 中的布局。
尝试更换您的
mDrawerLayout = (DrawerLayout) getActivity().findViewById(R.id.drawer_layout);
mDrawerList = (ListView) getActivity().findViewById(R.id.left_drawer);
和
mDrawerLayout = (DrawerLayout) root.findViewById(R.id.drawer_layout);
mDrawerList = (ListView) root.findViewById(R.id.left_drawer);
我有一个片段布局,它是抽屉,看起来像这样:
fragment_overview.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- The main content view -->
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffe887" />
<!-- The navigation drawer -->
<ListView android:id="@+id/left_drawer"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:choiceMode="multipleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="0dp"
android:background="#111"/>
</android.support.v4.widget.DrawerLayout>
以及该片段的 java class:
OverviewFragment.java
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_overview, container, false);
mlistOptions = getResources().getStringArray(R.array.list_options);
mDrawerLayout = (DrawerLayout) getActivity().findViewById(R.id.drawer_layout);
mDrawerList = (ListView) getActivity().findViewById(R.id.left_drawer);
// Set the adapter for the list view
mDrawerList.setAdapter(new ArrayAdapter<String>(getActivity(),
R.layout.simple_list_item_1, mlistOptions));
mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
return root;
}
在资源文件夹中使用此代码:
<string-array name="list_options">
<item>Ship</item>
<item>Map</item>
<item>Mail</item>
<item>Settings</item>
<item>Logout</item>
</string-array>
这是一个列表项:
simple_list_item_1.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="15dp"
android:textColor="@android:color/black"
android:textStyle="italic">
然而,当 setAdapter 方法在 java class 中运行时,它会生成此错误:
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference
该方法调用实际上可能出了什么问题?它是一个片段,所以我们需要 getActivity 作为第一个参数,布局文件只是对一个简单文件的引用,选项列表只是资源文件夹中的数组列表。什么可以为空?
提前致谢!
试试这个,而不是使用 getActivity 使用 root 是因为你的组件现在在根视图中,所以你会膨胀你的布局。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_overview, null);
mlistOptions = getResources().getStringArray(R.array.list_options);
mDrawerLayout = (DrawerLayout) root.findViewById(R.id.drawer_layout);
mDrawerList = (ListView) root.findViewById(R.id.left_drawer);
// Set the adapter for the list view
mDrawerList.setAdapter(new ArrayAdapter<String>(getActivity(),
R.layout.simple_list_item_1, mlistOptions));
mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
return root;
}
您应该在主 activity 中填充您的抽屉列表。将此代码放入 activity 的 onCreate 方法中。
然后在您的片段的 onCreateView 中,您应该膨胀另一个将放入您的(主要 activity 的)FrameLayout 中的布局。
尝试更换您的
mDrawerLayout = (DrawerLayout) getActivity().findViewById(R.id.drawer_layout);
mDrawerList = (ListView) getActivity().findViewById(R.id.left_drawer);
和
mDrawerLayout = (DrawerLayout) root.findViewById(R.id.drawer_layout);
mDrawerList = (ListView) root.findViewById(R.id.left_drawer);