簡體   English   中英

什么時候以編程方式添加片段的視圖?

[英]When does a programmatically added fragment's view get created?

我有一個FragmentActivity ,我使用FragmentTrasaction添加一個ListFragment 一切都很好,但是當我嘗試在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);
}

我很快意識到我試圖在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;
}

不幸的是,這仍然會因“尚未創建內容視圖”錯誤而崩潰。 我不明白這一點 - 在調用super.onCreateView之后肯定應該創建所有的視圖嗎?

我終於通過將它放在'onResume()' inItemClickListener使inItemClickListener工作,但我不知道為什么它在onCreateView不起作用。

任何人都可以開導我嗎?

謝謝。

Fragment有自己的生命周期,我記得你不能在包含FragmentActivity (或任何其他Activity )的默認Fragment生命周期事件中設置監聽器。 因此,如果使用默認的ListFragment ,則無法確定是否已創建列表視圖。

我終於通過將它放在'onResume()'上來使inItemClickListener工作,但我不知道為什么它在onCreateView中不起作用。

這可能對您有用,但也不安全,因為它不了解Fragment的生命周期狀態。

這里的默認/最佳實踐如下:編寫自己的Fragment類,讓它擴展ListFragment並將onClick邏輯放在片段的onListItemClick()方法中。

背景:
在Fragment的UI事件上設置任何偵聽器應該在Fragment本身內部發生,而不是在包含Activity中。 這就是為什么引入Fragments的原因之一:提供可以組合和重用的大多數獨立組件(具有自己的生命周期)。 否則,您可以使用ListActivity

OnCreateView創建一個視圖,使其在返回后可用,但不能在執行之前或執行期間使用。

ft.commit之后只需調用getSupportFragmentManager().executePendingTransactions(); executePendingTransactions )。

這會強制系統立即執行僅默認執行的ft.commit

之后,您的ListView應該可以訪問以定義OnClickListener (在FragmentActivity

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM