簡體   English   中英

多個片段中具有相同ID的視圖

[英]Views with same id in multiple fragments

我有一個自定義視圖“ ClearableTextView”,在相對布局內有一個EditText和一個按鈕。 該視圖是通過擴展布局文件創建的,因此這兩個視圖具有ID。

我也有兩個片段,每個片段都有自己的布局。 這兩個布局在其他視圖中都包含我自定義的ClearableTextView。

我知道重復使用相同的ID是不好的,並且結果是無法預測的,但是一位來自Google的名字聽起來像法語的人曾經說過,只要子視圖在父級中具有唯一的ID,找到正確的ID就不會有問題。 我搜索的視圖甚至沒有一個公共的根視圖,它們所在的視圖由不同的片段擁有。

我像這樣在片段A中尋找EditText的引用:

v= inflater.inflate(layoutA);
TextView tvA=v.findViewById("someLayoutUniqueID").findById(ClearableTextView_uniqueID_A).findViewById(editTextID);

對於片段B中的EditText:

v= inflater.inflate(layoutB);
TextView tvA=v.findViewById("anotherLayoutUniqueId").findById(ClearableTextView_uniqueID_B).findViewById(editTextID);

當我說一個ID是唯一的時,它意味着它在我項目的所有布局中都是唯一的。

現在,奇怪的東西:我創建了FragmentA。我不知道這是否重要,但是Fragment使用FragmentStatePagerAdapter附加到viewPager。 我在EditText中鍵入一些內容。 然后,我按下創建片段B的按鈕,從viewPager中刪除A,並將片段B附加到viewPager。 現在,在片段B中,EditText包含片段A中的文本! 為什么?

我知道viewpager結合了每個片段的視圖,但是在我的情況下不應該合並,因為始終只有一個片段被附加。 我正在他們的父母中搜索具有唯一ID的EditText視圖。 有任何想法嗎?

如果我沒記錯的話, ViewPager通常會將任何相鄰的片段保留在內存中,以便可以提高滑動性能。 它還保留了片段的狀態,以便可以快速重新加載該片段,其中包括視圖的值。 當您將片段添加到視圖分頁器時,它將導致您的片段被加載並附加到活動的視圖樹中。

過去,我遇到了類似的問題,並且一直將文本放入錯誤的TextView 我從未嘗試像您那樣嵌套findById調用,但是當我僅通過id搜索TextView ,通常會得到第一個聲明的對象。 您可以通過兩種方法解決此問題,第一種是使用不同的ID,這將需要一些剪切和粘貼操作(在某種程度上是可管理的)。 第二個最佳選擇是創建一個自定義視圖,該視圖將封裝此布局及其邏輯。 預定義按鈕的單擊以清除文本,並創建一個接口以暴露必要/必需的位,以使其在其余代碼中正常運行。

我知道這很晚了,但是我遇到了同樣的問題,我想我已經找到了一個簡單的解決方案。 不僅可以按ID查找EditText,還可以獲取該EditText的父級,然后查找像EditText這樣的子級,如下所示:

LinearLayout layout = (LinearLayout) LayoutInflater.from(this).inflate(R.layout.layout_with_editText);
EditText et = (EditText) layout.getChildAt(index); //whatever index your EditText is at

實際上,這將使您可以分配文本或對有問題的EditText進行任何工作,而不是將所有具有相同ID的內存全部分配給內存。 我在Spinners上也遇到了同樣的問題,並且此修復程序也適用。 希望這對解決這個問題的人有幫助

我有ViewPager和一些MyFragment.newInstance(uniqueId)與父RelativeLayout。 創建后,當我嘗試將任何視圖動態添加到該首頁上的任何其他視圖時,所有新視圖都添加到了第一頁。 最后,我幫助為onViewCreated中的每個RelativeLayout設置uniqueId。

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    vBackground.setId(mPresenter.getVehicle().getId());
}

暫無
暫無

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

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