【问题标题】:getActivity().findViewById(R.layout.contacts_list_view) returns nullgetActivity().findViewById(R.layout.contacts_list_view) 返回 null
【发布时间】:2013-12-29 15:03:53
【问题描述】:

我看到过一些类似的问题,但这都是出于不同的原因(我认为)。 我使用的代码取自http://developer.android.com/training。 我正在尝试根据教程构建一个简单的联系人应用程序: http://developer.android.com/training/contacts-provider/retrieve-names.html 我得到错误的部分是为 ListView 设置 CursorAdapter。 这是我的代码:

@Override
    public void onActivityCreated(Bundle savedInstanceState) 
    {
        super.onActivityCreated(savedInstanceState);
        mContactsList = (ListView) getActivity().findViewById(R.layout.contacts_list_view);
        mCursorAdapter = new SimpleCursorAdapter(getActivity(), 
                R.layout.contacts_list_item, null, FROM_COLUMNS, TO_COLUMN, 0);
        mContactsList.setAdapter(mCursorAdapter);
        mContactsList.setOnItemClickListener(this);
        getLoaderManager().initLoader(0, null, this);
    }

所有的 XML 文件都已经到位:

contact_list_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
          android:id="@android:id/text1"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:clickable="true"/>

contact_list_view.xml:

<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
          android:id="@android:id/list"
          android:layout_width="match_parent"
          android:layout_height="match_parent"/>

我的主要活动由 2 个FrameLayouts 组成,用于放入片段。这是 XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <FrameLayout
        android:id="@+id/frag_contacts"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:textColor="#0a20a3" >
    </FrameLayout>

    <FrameLayout 
        android:id="@+id/frag_contact_details"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textColor="#045011" />

</LinearLayout>

这是活动的onCreate:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ninth);
        if (findViewById(R.id.frag_contacts) != null)
        {
            if (savedInstanceState != null)
                return;
            ContactsFragment contactsFrag = new ContactsFragment();
            getFragmentManager().beginTransaction().add(R.id.frag_contacts, contactsFrag).commit();
        }
    }

另外,这是片段的onCreateView:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        return inflater.inflate(R.layout.contacts_list_view, container, false);
    }

现在,很抱歉,很长的帖子,其中一些可能是不必要的,但问题是在第一个 sn-p 上,getActivity().findViewById(R.layout.contacts_list_view) 一直返回 null! 不知道还能做什么。我还能如何将数据加载到列表中,这里有什么问题? 提前致谢!

【问题讨论】:

  • 您的列表名为 android.R.id.list ...

标签: android android-listview android-fragments nullpointerexception findviewbyid


【解决方案1】:

Fragment 状态会保存在 FragmentActivity 中,因此您应该在 Activity 中覆盖 onSaveInstanceState。

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    if(outState != null) {
        String FRAGMENTS_TAG = "android:support:fragments";
        outState.remove(FRAGMENTS_TAG);
    }
}

【讨论】:

    【解决方案2】:

    如果你试图在onCreateView中做getActivity().findViewById(R.id.contacts_list_view),它会返回null,因为Fragment的View还没有创建。尝试在 onResume 中执行此操作,它将返回视图:

    @Override
    public void onResume() {
        super.onResume();
        mContactsList = (ListView) getActivity().findViewById(R.id.contacts_list_view);
     }
    

    【讨论】:

      【解决方案3】:

      替换

      mContactsList = (ListView) getActivity().findViewById(R.layout.contacts_list_view);
      

      到

      mContactsList = (ListView) getView().findViewById(R.id.list);
      

      contact_list_view.xml 修改如下

      <?xml version="1.0" encoding="utf-8"?>
      <ListView xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="**@+id/list**"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
      

      【讨论】:

        【解决方案4】:

        改变这个

        mContactsList = (ListView) getActivity().findViewById(R.layout.contacts_list_view);
        

        到

        mContactsList = (ListView) getView().findViewById(R.id.contacts_list_view);
        

        编辑:

        <ListView xmlns:android="http://schemas.android.com/apk/res/android"
              android:id="@+idlist"
        

        和

         mContactsList = (ListView) getView().findViewById(R.id.list);
        

        【讨论】:

        • 感谢您的快速回答,但仍然无法正常工作。我仍然是空的。
        • 感谢 Raghunandan,我回答了下面的黑带,说明了我不能这样做的原因
        【解决方案5】:

        您必须等到Fragment 附加到Activity。你可以在 Fragment 类中做到这一点 onAttach(Activity)

        【讨论】:

          【解决方案6】:

          你必须改变

          mContactsList = (ListView) getActivity().findViewById(R.layout.contacts_list_view);
          

          与

          mContactsList = (ListView) getView().findViewById(R.id.contacts_list_view);
          

          由于 ListView 属于您在 onCreateView 中返回的 View。

          【讨论】:

          • 感谢 blackbelt,但请参阅我对 Raghunandan 的评论 - 它没有帮助。
          • @AndroidNewbie 你需要 id R.id.contacts_list_view 而不是布局
          • @AndroidNewbie 当然你必须检查 ListView 而不是包含它的布局
          • 是的,当然,我也在考虑,但教程中是这样写的。我一定错过了什么。正如您在contact_list_view.xml 中看到的,我(他们)没有为Lis​​tView 定义新的ID。因此R.id.contacts_list_view 在项目中不存在。是他们的错误,还是我不得不做一些额外的事情?我该怎么办?再次,非常感谢
          • 您可以尝试使用 id android.R.id.list 检索您的列表或更改您的 ListView 的 id。 @android:id/list 仅在扩展 ListActivity 或 ListFragment 时是必需的
          猜你喜欢
          • 2019-04-04
          • 1970-01-01
          • 2011-03-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多