0

我有一个FragmentActivity我添加一个ListFragment到 using的FragmentTrasaction. 一切都很好,但是我在尝试设置 中的 时遇到了“未创建内容视图”错误 ,onItemClickListener如下所示:ListViewListFragment

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

我很快意识到我正在尝试调用getListViewonCreate方法,因此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所有视图之后肯定现在应该已经创建了吗?

我终于inItemClickListener通过将它放在“onResume()”上来工作,但我不知道为什么它在onCreateView.

任何人都可以启发我吗?

谢谢。

4

3 回答 3

2

Fragments 有自己的生命周期,我记得你不能Fragment在包含FragmentActivity(或任何其他Activity)内的默认生命周期事件上设置侦听器。因此,如果您使用默认的ListFragment.

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

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

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

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

于 2013-04-07T17:51:11.053 回答
0

OnCreateView创建一个视图,使其在返回后可用,但在执行之前或执行期间不可用。

于 2013-04-07T16:34:50.010 回答
0

只需ft.commit调用getSupportFragmentManager().executePendingTransactions();(executePendingTransactions )。

这会强制系统立即执行ft.commit默认情况下仅计划执行的操作。

之后,您的 ListView 应该可以被访问以定义OnClickListener(在您的内部FragmentActivity

于 2013-04-07T17:45:32.867 回答