2016-06-07 52 views
-1

Android developer documentation for fragments這樣說:片段混亂

「注意:當您的佈局XML文件中定義 片段添加片段與活動佈局,你不能在 運行時刪除片段如果您計劃在用戶 互動中交換片段時,必須在 活動首次啓動時將該片段添加到活動中,如下一課所示。「

而且這部分是因爲這個,我鑽進總是使用片段經理添加/刪除片段/從我的用戶界面(即使我不希望在運行時「熱插拔」它們)的習慣。我100%肯定當我試圖在運行時刪除/替換「硬連線」XML片段時,我的應用程序崩潰,出現異常。

我還沒有真正與XML片段合作過幾個月,但今天,在百靈,我決定玩弄,我發現我能夠交換XML片段的其他片段和...它的作品?我無法在網上找到任何討論此行爲近期變化的內容。它只是工作。

我的佈局代碼是在這裏:

<?xml version="1.0" encoding="utf-8"?> 

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/fl_frag" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:orientation="vertical" 
    tools:context="mobappdev.demo.myapplication.MainActivity"> 

    <fragment 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1" 
      android:id="@+id/frag" 
      android:name="mobappdev.demo.myapplication.BlankFragment"/> 

    <Button 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:text="@string/click_me" 
     android:onClick="clickMe"/> 
</LinearLayout> 

這裏是替換片段中的代碼:

public void clickMe(View view) { 

    FragmentManager manager = getSupportFragmentManager(); 

    BlankFragment newFrag = BlankFragment.newInstance(); 
    Fragment oldFrag = manager.findFragmentById(R.id.frag); 
    Log.i("TESTING", "old frag is null: " + (oldFrag == null)); 

    manager.beginTransaction() 
    .replace(R.id.fl_frag, newFrag) 
    .commit(); 
} 

它的工作沒有任何問題。我已經嘗試了各種變體(例如將XML片段放在FrameLayout中),並且它似乎都可以正常工作。我甚至嘗試過諸如刪除/添加以及刪除等變體,並且它們都可以毫無問題地運行。

那麼我錯過了什麼?

+0

也許他們修復了它? – DeeV

+0

嗯,這不是一個錯誤,它是一個功能。但即使他們改變了它,目前的文件(上面鏈接)仍然說它不能完成。 –

+0

如果是這種情況,也許可以使用常規的FragmentManager而不是支持來嘗試,並查看它是否仍然存在。支持FragmentManager畢竟只是系統的一個模擬,所以它必須以不同的方式做事。 – DeeV

回答

1

不是替換片段本身,而是在其上添加一個新的片段。這只是一個小問題,但是你使用容器上的FragmentManager(LinearLayout)而不是在片段本身上進行替換(R.id.fl_frag而不是R.id.frag)

+0

你是對的。這有幾個原因並不明顯。首先,片段管理器高興地「移除」舊的片段;它不能再使用它的ID找到(findFragmentById返回null),但片段保留在接口中。其次,因爲我在老的頂部放置了一個相同的片段,所以我沒有注意到它們被覆蓋了。 我能夠更好地看到發生了什麼事情,將舊的片段替換爲一個新的片段,其中包含不同的文本信息。結果更加明顯,因爲我可以看到兩個不同的字符串相互重疊。 –