Android ListView App 崩溃错误
Android ListView App crash error
我尝试在片段中设置 listView,但我的应用程序崩溃了,尝试在互联网上搜索但找不到答案。
Java 源代码:
public static class FragmentFind extends Fragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
String [] cinemas={
"Cinema 1","Cinema 2","Cinema 3"
};
ArrayAdapter<String> adapter=new ArrayAdapter<>(getActivity(),android.R.layout.simple_list_item_1,cinemas);
ListView list=(ListView) getActivity().findViewById(R.id.cinema_list);
list.setAdapter(adapter);
return inflater.inflate(R.layout.fragment_find,container,false);
}
}
Android XML 片段布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/cinema_list"
android:layout_alignParentTop="true"/>
</RelativeLayout>
谢谢。
我相信错误可能是空异常。我从你的片段中看到的主要区别。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View v = inflater.inflate(R.layout.whatever, container, false);
View testview= (View) v.findViewById(R.id.id);
return v;
}
因为你的ListView是Null。由于您的 Listview 是 Fragment 布局的一部分,因此您必须在该片段布局文件膨胀的视图上调用 findViewById()
。
所以试试看,
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_find,container,false);
String [] cinemas={"Cinema 1","Cinema 2","Cinema 3"};
ArrayAdapter<String> adapter=new ArrayAdapter<>(getActivity(),android.R.layout.simple_list_item_1,cinemas);
ListView list=(ListView) view.findViewById(R.id.cinema_list);
list.setAdapter(adapter);
return view;
}
当应用尝试通过以下方式搜索时,您的 activity 没有 ListView
R.id.cinema_list
:getActivity().findViewById(R.id.cinema_list);
因此,您最好通过以下方式在膨胀视图中搜索 ListView
:
View view = inflater.inflate(R.layout.fragment_find,container,false);
ListView myList = (ListView)view.findViewById(R.id.cinema_list);
然后设置适配器和return view
.
你很幸运你的应用程序崩溃了。如果您的 activity 布局有 ListView
和 R.id.cinema_list
,那么 getActivity().findViewById(R.id.cinema_list)
也有可能找到 ListView
。我这样说是因为很明显你只有一个 ListView
具有这样的特定 id,但有时人们会使用常见的 id,例如 listView1
。所以你还是小心点吧。
替换为:
ListView list=(ListView) getActivity().findViewById(R.id.cinema_list);
有了这个:
ListView list = (ListView) view.findViewById(R.id.cinema_list);
我建议你看看 Fragment.Even 中 onCreateView()
和 onViewCreated()
之间的区别,但你可以在 onCreateView()
方法中做同样的事情,最好在onViewCreated()
方法
中设置适配器
这就是问题所在,
ListView list=(ListView) getActivity().findViewById(R.id.cinema_list);
这是我的做法。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_find,container,false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState){
String [] cinemas={
"Cinema 1","Cinema 2","Cinema 3"
};
ArrayAdapter<String> adapter=new ArrayAdapter<>(getActivity(),android.R.layout.simple_list_item_1,cinemas);
ListView list=(ListView) view.findViewById(R.id.cinema_list);
list.setAdapter(adapter);
}
我尝试在片段中设置 listView,但我的应用程序崩溃了,尝试在互联网上搜索但找不到答案。
Java 源代码:
public static class FragmentFind extends Fragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
String [] cinemas={
"Cinema 1","Cinema 2","Cinema 3"
};
ArrayAdapter<String> adapter=new ArrayAdapter<>(getActivity(),android.R.layout.simple_list_item_1,cinemas);
ListView list=(ListView) getActivity().findViewById(R.id.cinema_list);
list.setAdapter(adapter);
return inflater.inflate(R.layout.fragment_find,container,false);
}
}
Android XML 片段布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/cinema_list"
android:layout_alignParentTop="true"/>
</RelativeLayout>
谢谢。
我相信错误可能是空异常。我从你的片段中看到的主要区别。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View v = inflater.inflate(R.layout.whatever, container, false);
View testview= (View) v.findViewById(R.id.id);
return v;
}
因为你的ListView是Null。由于您的 Listview 是 Fragment 布局的一部分,因此您必须在该片段布局文件膨胀的视图上调用 findViewById()
。
所以试试看,
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_find,container,false);
String [] cinemas={"Cinema 1","Cinema 2","Cinema 3"};
ArrayAdapter<String> adapter=new ArrayAdapter<>(getActivity(),android.R.layout.simple_list_item_1,cinemas);
ListView list=(ListView) view.findViewById(R.id.cinema_list);
list.setAdapter(adapter);
return view;
}
当应用尝试通过以下方式搜索时,您的 activity 没有 ListView
R.id.cinema_list
:getActivity().findViewById(R.id.cinema_list);
因此,您最好通过以下方式在膨胀视图中搜索 ListView
:
View view = inflater.inflate(R.layout.fragment_find,container,false);
ListView myList = (ListView)view.findViewById(R.id.cinema_list);
然后设置适配器和return view
.
你很幸运你的应用程序崩溃了。如果您的 activity 布局有 ListView
和 R.id.cinema_list
,那么 getActivity().findViewById(R.id.cinema_list)
也有可能找到 ListView
。我这样说是因为很明显你只有一个 ListView
具有这样的特定 id,但有时人们会使用常见的 id,例如 listView1
。所以你还是小心点吧。
替换为:
ListView list=(ListView) getActivity().findViewById(R.id.cinema_list);
有了这个:
ListView list = (ListView) view.findViewById(R.id.cinema_list);
我建议你看看 Fragment.Even 中 onCreateView()
和 onViewCreated()
之间的区别,但你可以在 onCreateView()
方法中做同样的事情,最好在onViewCreated()
方法
这就是问题所在,
ListView list=(ListView) getActivity().findViewById(R.id.cinema_list);
这是我的做法。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_find,container,false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState){
String [] cinemas={
"Cinema 1","Cinema 2","Cinema 3"
};
ArrayAdapter<String> adapter=new ArrayAdapter<>(getActivity(),android.R.layout.simple_list_item_1,cinemas);
ListView list=(ListView) view.findViewById(R.id.cinema_list);
list.setAdapter(adapter);
}