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_listgetActivity().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 布局有 ListViewR.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);
    }