尝试实现tabView布局,findViewByID上的null对象引用

时间:2016-02-29 06:31:46

标签: java android android-layout android-fragments android-tablayout

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

我不确定这是否是一种正确的方法(我问这个问题的一个重要原因),但在我的片段OnCreate中,我运行一个AsyncTask,它动态加载片段内的ListView来自我的JSON API的数据 - >这适用于FIRST选项卡,但对于SECOND选项卡,我收到以下错误:

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的列表是在ManagedEvent活动的XML下定义的,但似乎当它尝试按该ID查找元素时,它找不到它并返回空引用。

我猜测这是因为默认情况下没有选中我的第二个标签,所以一旦加载应用程序,视图就不存在了?该行为表明该活动正在尝试立即加载我的两个列表,这对我来说很好,但似乎它无法访问我的第二个片段中的列表......

如果我注释掉代码从API加载第二个标签的片段列表,那么没有错误发生,我可以在显示加载的第一个标签的选项卡之间来回切换,而在第二个选项卡中没有任何内容,但是一旦我尝试加载第二个选项卡的数据,空指针异常。

我想知道这个解决方案是什么/正确的方法......如果你能以任何方式提供帮助,我真的很感激。我一直在浏览教程和文档几个小时,似乎找不到任何有用的东西。

这是我的第二个标签片段中的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);
}

编辑:

对于任何磕磕绊绊的人: 上面代码块的最后一行是我的问题。我克隆了我的第一个活动的第一个文件,因为它们非常相似,忘了重构R.layout.fragment_eventsR.layout.fragment_managed_events ...还看到艾哈迈德的答案,这可能是更好的方法。

以下是我的第二个标签片段中的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>

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

1 个答案:

答案 0 :(得分:2)

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

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