gpt4 book ai didi

java - 何时创建以编程方式添加的 fragment View ?

转载 作者:行者123 更新时间:2023-12-02 07:08:02 25 4
gpt4 key购买 nike

我有一个 FragmentActivity,我使用 FragmentTrasaction 添加一个 ListFragment。一切都很好,但是当我尝试在 ListFragment 中设置 ListViewonItemClickListener 时,遇到了“内容 View 未创建”错误>,像这样:

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);
}

我很快意识到我正在尝试在 onCreate 方法中调用 getListView,因此 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;
}

不幸的是,这仍然会崩溃并出现“内容 View 尚未创建”错误。我不明白这一点 - 在调用 super.onCreateView 之后,所有 View 现在应该已经创建了吗?

我终于通过将 inItemClickListener 放在“onResume()”上使其工作,但我不知道为什么它在 onCreateView 中不起作用。

谁能启发我吗?

谢谢。

最佳答案

Fragment 有自己的生命周期,我记得您无法在包含 FragmentActivity 的默认 Fragment 生命周期事件上设置监听器(或者任何其他 Activity )。因此,如果使用默认的ListFragment,则无法确定 ListView 是否已经创建。

I finally got the inItemClickListener to work by putting it on 'onResume()', but I don't know why it did't work in onCreateView.

这可能对您有用,但也不安全,因为它不知道 Fragment 的生命周期状态。

这里的默认/最佳实践如下:编写自己的 Fragment 类,让它扩展 ListFragment 并将 onClick 逻辑放在 onListItemClick() 中您的 fragment 的方法。

背景:
对 Fragment 的 UI 事件设置任何监听器都应该在 Fragment 本身内部进行,而不是在包含的 Activity 中进行。这就是引入 Fragment 的原因之一:提供可以组合和重用的大部分独立组件(具有自己的生命周期)。否则,您可以只使用 ListActivity

关于java - 何时创建以编程方式添加的 fragment View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15864743/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com