簡體   English   中英

為什么我的片段未附加到活動錯誤?

[英]Why am I getting Fragment not Attached to Activity Error?

我有一個線程會在我的Activity中觸發一個帶片段的回調方法。 然后,Activity調用Fragment中的方法來刷新具有新信息的UI。 在該方法中,將調用getString()。 調用getstring()時,出現“片段未附加到活動錯誤”的信息。 此UI刷新錯誤由runOnUIThread保護。 片段添加如下:

 FragmentManager fm = getSupportFragmentManager();
        fm.beginTransaction()
            .add(fragmentContainerID, fragment, tag)
            .commit();
        fm.executePendingTransactions();

該活動將兩個不同的布局文件用於水平和垂直方向。 它們是兩種布局中的兩個片段容器。 它們在水平和垂直布局中的名稱相同,但彼此不匹配。 第一次創建Activity時,使用上述代碼添加了片段。 更改方向時,片段會自動添加到布局中,因為片段容器在垂直和水平方向上都具有相同的ID。 當saveInstanceState不為null時,我通過使用以下方式獲取對片段的引用

fm.findFragmentByTag

誰能告訴我我做錯了嗎? 可以將片段明顯地很好地添加到Activity中,並且在此線程回調發生之前經過了幾分鍾,所以我看不到片段沒有被“附加”。

編輯:嘆息,經過一些調試,我發現以這種方式添加片段非常好。 活動中其他地方的代碼(我注冊了兩次回調)導致片段未附加錯誤。 如果有人讀到此錯誤,請記住該問題可能是從其他地方觸發的。 同樣,您必須在片段中將ResetInstance設置為true以避免重新創建它。 僅憑標簽就不能做到這一點。

片段因此,如果使用的是添加了一個每容器.add(fragmentContainerID, fragment, tag)確保首先該fragmentContainerID對於每個加入的片段的不同。

但是,這類問題通常是由於對方向變化的處理方式存在誤解造成的。 當您更改方向並讓oncreate處理添加時: 您會得到一個相同類型的新片段,這意味着,如果后台任務引用了您的片段-它引用了舊的 (現在是分離的)片段。 您需要做的是確保將相同的片段添加到標記中(而不是新實例)。 為此,僅在恢復狀態時不要(重新)創建片段實例

public class MyActivity ... {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    FragmentManager fm = getSupportFragmentManager();
    if (savedInstanceState == null) {
        MyFragment frag = new MyFragment();
        frag.setArguments( getIntent().getExtras() ); //if it takes params
        fm.beginTransaction().add(fragmentContainerID, frag, tag).commit();
    }

    //after this point a call to MyFragment frag = (MyFragment) fm.findFragmentByTag(tag); should always return the correct fragment
}

對於您的任務來說,在執行回調以更新UI(而不是保留對它的引用)時查找片段是正確的選擇,這也是一個明智的想法。 取決於您如何設置任務,這僅意味着從FragmentManager fm = getSupportFragmentManager();更改為FragmentManager fm = getSupportFragmentManager(); 然后創建任務,將其作為onPostExecute一部分進行調用

更改方向時,片段會自動添加到FragmentManager並忘記自己的標簽!

使用以下代碼查找您的片段:

FragmentManager fragmentManager= getSupportFragmentManager();
for (Fragment fragment : fragmentManager.getFragments())
{
    if(fragment instanceof MyFragment)
        myFragment = (MyFragment)fragment;
}

找到方向改變的片段后,請嘗試分離它們,然后在執行任何操作之前將其重新連接。 或者,如果這樣不起作用,請將其刪除並添加。 然后繼續.....我什至不得不在分離后和連接之前有時要花幾毫秒的時間,以確保一切正常。

暫無
暫無

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

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