我有FragmentActivity
我使用ListFragment
添加了一个FragmentTrasaction
。一切都很好,但在尝试设置onItemClickListener
中ListView
的{{1}}时,我遇到了“内容视图未创建”错误,如下所示:
ListFragment
我很快意识到我试图在public class ContactList extends FragmentActivity implements
LoaderManager.LoaderCallbacks<Cursor>, OnItemClickListener {
static private final String TAG = ContactList.class.getSimpleName();
private SimpleCursorAdapter mListAdapter;
ListFragment mListFrag;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mListFrag = new ListFragment();
if (savedInstanceState == null) {
// add list view fragment
FragmentTransaction ft = getSupportFragmentManager()
.beginTransaction();
ft.add(android.R.id.content, mListFrag);
ft.commit();
}
// set up list view adapter:
mListAdapter = new SimpleCursorAdapter(this,
android.R.layout.simple_list_item_1, null,
new String[] { ContactsContract.Contacts.DISPLAY_NAME },
new int[] { android.R.id.text1 },
SimpleCursorAdapter.NO_SELECTION);
// (we will switch in the cursor later)
mListFrag.setListAdapter(mListAdapter);
// set list view click listener:
// (THIS LINE, I KNOW NOW, CAUSES PROBLEMS - SO I MOVED IT
// TO onCreateView):
//mListFrag.getListView().setOnItemClickListener(this);
// initial cursor loader:
getSupportLoaderManager().initLoader(0, null, this);
}
方法中调用getListView
,因此onCreate
尚未显示。因此,我将行ListView
行移至setOnItemClickListener
:
onCreateView
不幸的是,这仍然会因“尚未创建内容视图”错误而崩溃。我不明白这一点 - 在调用@Override
public View onCreateView(String name, Context context, AttributeSet attrs) {
View v = super.onCreateView(name, context, attrs);
// set list view click listener:
mListFrag.getListView().setOnItemClickListener(this); // this still crashes
return v;
}
之后肯定应该创建所有的视图吗?
我终于将super.onCreateView
置于'onResume()'上,但我不知道为什么它在inItemClickListener
中不起作用。
任何人都可以启发我吗?
感谢。
答案 0 :(得分:2)
Fragment
有自己的生命周期,我记得你不能在包含Fragment
(或任何其他FragmentActivity
)的默认Activity
生命周期事件中设置监听器。
因此,如果使用默认ListFragment
,则无法确定是否已创建列表视图。
我终于让inItemClickListener通过启用它来工作 &#39; onResume()&#39;,但我不知道为什么它在onCreateView中工作。
这可能适合您,但也不安全,因为它不了解Fragment的生命周期状态。
此处的默认/最佳做法如下:编写您自己的Fragment类,让它扩展ListFragment
并将onClick逻辑放在片段的onListItemClick()
方法中。
<强>背景强>
在Fragment的UI事件上设置任何侦听器应该在Fragment本身内部发生,而不是在包含Activity中。这就是为什么引入Fragments的原因之一:提供可以组合和重复使用的大多数独立组件(具有自己的生命周期)。否则,您可以使用ListActivity
。
答案 1 :(得分:0)
OnCreateView创建一个视图,使其在返回后可用,但不在执行之前或执行期间。
答案 2 :(得分:0)
在ft.commit
之后,只需致电getSupportFragmentManager().executePendingTransactions();
(executePendingTransactions)。
这会强制系统立即执行ft.commit
,该OnClickListener
仅计划默认执行。
之后,您的ListView应该可以访问以定义FragmentActivity
(在{{1}}内)