getActivity().findViewById(R.layout.contacts_list_view) 返回 null

Posted

技术标签:

【中文标题】getActivity().findViewById(R.layout.contacts_list_view) 返回 null【英文标题】:getActivity().findViewById(R.layout.contacts_list_view) returns 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_
          android:layout_
          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_
          android:layout_/>

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

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

    <FrameLayout
        android:id="@+id/frag_contacts"
        android:layout_
        android:layout_
        android:textColor="#0a20a3" >
    </FrameLayout>

    <FrameLayout 
        android:id="@+id/frag_contact_details"
        android:layout_
        android:layout_
        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 ... 【参考方案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_
      android:layout_/>

【讨论】:

【参考方案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 时是必需的

以上是关于getActivity().findViewById(R.layout.contacts_list_view) 返回 null的主要内容,如果未能解决你的问题,请参考以下文章

片段 getActivity() 与接口回调?

getActivity() 在片段的 AlertDialog 中为 null

在 Fragment 中使用 .getActivity() 后无法访问的语句

AsyncTask 中的 getDefaultSharedPreferences(getActivity())

getActivity() 在片段上返回 null?

Android (安卓) getContext 和 getActivity的区别