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 个FrameLayout
s 组成,用于放入片段。这是 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 你需要 idR.id.contacts_list_view
而不是布局
@AndroidNewbie 当然你必须检查 ListView 而不是包含它的布局
是的,当然,我也在考虑,但教程中是这样写的。我一定错过了什么。正如您在contact_list_view.xml 中看到的,我(他们)没有为ListView 定义新的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() 在片段的 AlertDialog 中为 null
在 Fragment 中使用 .getActivity() 后无法访问的语句