java - 尝试实现选项卡布局,findViewByID 上的空对象引用

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

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

我不确定这是否是执行此操作的正确方法(我问这个问题的一个重要原因),但在我的 fragment OnCreate 中,我运行一个 AsyncTask ,它使用以下命令动态加载 fragment 内的 ListView来 self 的 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 的列表是在 ManagedEvent Activity 的 XML 下定义的,但似乎当它尝试通过该 ID 查找元素时,它找不到它并返回 null 引用。

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

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

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

这是我的第二个选项卡 fragment 中的 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_management_events ...另请参阅 Ahmed 的答案,这可能是更好的方法。

这是我的第二个选项卡 fragment 内的 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() { ...

这是我的第二个选项卡 fragment 的 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方法。如果您有一个 fragment ,您将不会注意到,但如果您有多个 fragment ,则可能会出现这种情况。

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

关于java - 尝试实现选项卡布局,findViewByID 上的空对象引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35693254/

相关文章:

java - 无法在 Octave 中使用 Java

java - 如何从 map 中删除/删除 Entry<K,V> 列表?

java - 如何将UV纹理从 blender 加载到opengl android java

android - ViewPager 中的 RecyclerView 不会滚动

android - 如何将imageView放在工具栏的最左边?

java - 如何将不带 Z 的 Java 日期转换为带 Z 的日期

java - 在 CorDapp 上本地部署节点时出现异常 - 节点信息生成

android - 使用 Ionic 创建自定义相机 View

java - 如何更新 navMenuIcons 上的数字

Android 资源编译失败(非转义字符)- 即使我修复了错误