2014-03-25 53 views
1

如果我更換(比方說)一個TextView:通過這段代碼通過片段代替的東西用一個片段

transaction.replace(R.id.TextView01, fragment1); 

是否新的片斷(這是目前可見的佈局)有相同的ID被替換的一個? (在這種情況下,它是R.id.TextView01)。

這可能看起來像無稽之談,但我將這個動作設置爲按鈕上的動作,並重覆按下它不會導致任何錯誤。

那麼,它是否有被替換的ID的ID,或者它只是點擊幾次(因爲片段有它的唯一ID)而不會被替換?

+0

當你設置一個新的片段時,你還應該給它一個字符串標籤,以後可以用它來引用; – Eenvincible

+0

據我所知,有兩種交易方式可以替代: 替換(id,fragment,tag)和replace(id,fragment)。在第二個是標籤設置爲空(根據文檔)。那麼哪個id應該被轉換成? – ViliX64

+1

對於爲什麼要用'Fragment'替換'TextView'稍有困惑。一個'TextView'是一個相當愚蠢的UI小部件,而'Fragment'具有接近'Activity'的智能。我可以理解,用另一個'Fragment'代替只包含一個'TextView'的Fragment',但不能用'Fragment'代替'TextView'。另外,不管...'TextView'的id是它自己的,不管它是否可見。 – Squonk

回答

1

當你做replace(id, fragment)你不會取代id而是view。所述第一參數是int containerViewId其用於:在容器的

標識符,其片段(一個或多個)將被替換

這僅僅是該容器。如您所知,替換方法是removeadd方法的組合。當您看到remove方法時,您可以閱讀:

刪除現有片段。如果將其添加到容器,則其視圖也會從該容器中移除。

您使用remove(Fragment fragment),您不使用任何id。另外,「來自該容器」意味着該容器不會在佈局上被移除,因此您不使用任何id而減少容器ID。
有一個「id」的唯一方法是使用:

replace(int containerViewId, Fragment fragment, String tag) 

String tag允許您使用findFragmentByTag(String)檢索此片段。
最後,@Squonk說,這真是「醜陋」來代替TextViewFragment,更可欣賞羣體喜歡LinearLayoutRelativeLayout,等等。唯一的「正確」的方式來顯示一個片段是FrameLayout其中:

旨在阻擋屏幕上的區域以顯示單個項目。

如果你搜索了一下FrameLayoutLinearLayoutRelativeLayout等擴展ViewGroup但唯一一個可以包含一個片段和重疊它的FrameLayout(如特殊的ViewGroup)的意見。

0

Fragments不是Views。意見應該有獨特的ID,碎片本身應該有獨特的ID。但是在大多數情況下,片段可能有一個Views ID。

在你的情況,是的,他們有相同的ID。

但我認爲他們可能是一個額外的問題在這裏。當Fragments視圖膨脹時,該視圖將作爲提供的id中的一個子項添加。由於您的觀點僅爲TextView,並且不支持子視圖,因此我不確定片段是否在此處添加actually