尝试实现选项卡布局,findViewByID 上的空 object 引用

Trying to implement tab layout, null object reference on findViewByID

如标题所示,我正在尝试实现选项卡布局。

我不确定这是否是执行此操作的正确方法(这是我问这个问题的一个重要原因),但在我的片段 OnCreate 中,我 运行 一个动态加载片段中的 ListView 以及来自我的 JSON API 的数据 -> 这对于第一个选项卡工作正常,但对于第二个选项卡,我收到以下错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference

此错误是由以下代码行引起的:

ListView listView = (ListView) getView().findViewById(R.id.managed_event_list);

具有此 ID 的列表是在 XML 下为 ManagedEvent activity 定义的,但是当它试图通过该 ID 查找元素时,它似乎找不到它并且 returns 空引用。

我推测这是因为默认情况下未选中我的第二个选项卡,因此在加载应用程序后该视图还不存在?该行为表明 activity 正在尝试立即加载我的两个列表,这对我来说很好,但它似乎无法访问我的第二个片段中的列表...

如果我注释掉从 API 加载第二个选项卡的片段列表的代码,那么不会发生错误,我可以在选项卡之间来回切换,显示第一个选项卡已加载,而第二个选项卡没有显示,但是当我尝试加载第二个选项卡的数据时,出现空指针异常。

我想知道这种 is/proper 方法的解决方案是什么...如果您能以任何方式提供帮助,我将不胜感激。我已经浏览了数小时的教程和文档,但似乎找不到任何有用的东西。

这是我的第二个标签片段中的 onCreateView:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    // Construct the data source
    mLoadTask = new EventLoadTask();
    mLoadTask.execute((Void) null);

    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_events, container, false);
}

编辑:

对于遇到此问题的任何人: 上面代码块的最后一行是我的问题。我从第一个 activity 的文件中克隆了第二个 activity 的文件,因为它们非常相似并且忘记将 R.layout.fragment_events 重构为 R.layout.fragment_managed_events ...另请参阅 Ahmed 的回答,这可能是更好的方法这样做。

这是我的 AsyncTask 在我的第二个标签片段中的一些代码:

@Override
    protected void onPostExecute(final Boolean success) {
        mLoadTask = null;

        if (success) {
            Gson gson = new Gson();
            EventList events = gson.fromJson(mResponse, EventList.class);

            Log.w("Retrieved events", events.toString());

            // Create the adapter to convert the array to views
            final EventListAdapter adapter = new EventListAdapter(getActivity().getApplicationContext(),
                    events.getEvents());
            // Attach the adapter to a ListView
            ListView listView = (ListView) getView().findViewById(R.id.managed_events_list);
            listView.setAdapter(adapter);
            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { ...

这是我的第二个标签的片段 XML:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ManagedEventsFragment">

<ListView
    android:id="@+id/managed_events_list"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"/>

</FrameLayout>

如果您需要查看其他内容,请发表评论

问题是您在创建 ,fragment view 之前从网络加载,这在 getView() 方法中导致 null。如果您有一个片段,您不会注意到,但如果您有多个片段,则可能会出现这种情况。

您应该在创建视图后进行网络通信,而不是在 onViewCreated()onCreateView() 回调等 onCreate() 方法上进行。