什么时候以编程方式添加片段的视图?

时间:2013-04-07 16:29:00

标签: java android android-fragments

我有FragmentActivity我使用ListFragment添加了一个FragmentTrasaction。一切都很好,但在尝试设置onItemClickListenerListView的{​​{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中不起作用。

任何人都可以启发我吗?

感谢。

3 个答案:

答案 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}}内)