我正在按照联系人提供者的课程来检索联系人并使用片段显示它们。作为参考,我已将 API 级别设置为 16(Android 4.1)。
我大部分时间都严格按照本教程进行操作,但也有一些值得注意的例外。例如,我从而mypackage.R
不是导入android.R
。
我的问题出在我的onActivityCreated
处理程序中ListContactsFragment
:
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// Initializes the loader
getLoaderManager().initLoader(0, null, this);
// Gets the ListView from the View list of the parent activity
View mContactsListView =
getActivity().findViewById(R.layout.contacts_list_view);
mContactsList = (ListView) mContactsListView;
// Gets a CursorAdapter
mCursorAdapter = new SimpleCursorAdapter(
getActivity(),
R.layout.contacts_list_item,
null,
FROM_COLUMNS, TO_IDS,
0);
// Sets the adapter for the ListView
mContactsList.setAdapter(mCursorAdapter);
// Set the item click listener to be the current fragment.
mContactsList.setOnItemClickListener(this);
}
View mContactsListView
为空,表示findViewById
无效。
我的父活动是 eclipse 创建的默认活动。为此,我做了两件事:
- 如果您不这样做,请替换
import android.app.Activity
为android.support.v4.app.FragmentActivity
以防止发生这种情况。ClasscastException
- 将我的片段导入 XML。
我的activity_list_contacts.xml
样子是这样的:
<RelativeLayout 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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".ListContactsActivity" >
<fragment android:name="mypackage.ListContactsFragment"
android:id="@+id/contacts_list_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
匹配活动,以防万一:
public class ListContactsActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_contacts);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.list_contacts, menu);
return true;
}
}
和contacts_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"/>
所以我的问题是,我做错了什么findViewById
没有找到我的观点?
我尝试过的事情(其中大部分是对几乎看起来与此问题重复的问题的公认答案):
- 阅读我逐字复制和粘贴的文档。
- 尝试按照这个问题
getView().findViewById()
中的建议。这也返回 null。 - 按照这个答案
findViewById(R.id.contacts_list_view);
的建议使用。这不会返回 null;相反,它会导致 a in无法转换为.ClassCastException
android.support.v4.app.NoSaveStateFrameLayout
android.widget.ListView
我读到有时创建的片段回调发生在附加到活动之前。因此,我将处理程序添加到
onAttach
方法中,如下所示:@Override public void onAttach(Activity activity) { super.onAttach(activity); View mContactsListView = activity.findViewById(R.id.contacts_list_view); mContactsList = (ListView) mContactsListView; // Gets a CursorAdapter mCursorAdapter = new SimpleCursorAdapter( getActivity(), R.layout.contacts_list_item, null, FROM_COLUMNS, TO_IDS, 0); // Sets the adapter for the ListView mContactsList.setAdapter(mCursorAdapter); // Set the item click listener to be the current fragment. mContactsList.setOnItemClickListener(this); }
你猜对了 - 仍然为空。
所以在这一点上我有点失落。我有两个问题:
- 我做错了什么(如果我没有提供足够的信息,请在评论中请求更多信息)?
- 最好将适配器设置保留在
onAttach
或教程中。