2013-02-27 86 views
0

我有一個自定義視圖「ClearableTextView」,在相對佈局中有一個EditText和一個按鈕。該視圖是通過膨脹佈局文件創建的,因此這兩個視圖都有ID。在多個片段中具有相同ID的視圖

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

我知道,重複使用相同的ID是不好的,結果是不可預知的,但是一個來自谷歌的人的名字聽起來像法國人曾經說過,只要孩子的意見在父母中有獨特的ID應該不會有問題找到合適的人。我搜索到的視圖甚至沒有共同的根視圖,它們的視圖由不同的碎片擁有。

我尋找的EditText的片段A像這樣的參考:

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

而對於的EditText在片段B:

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

當我說的ID是唯一的,這意味着它在我的項目中的所有佈局中都是獨一無二的。

現在奇怪的東西: 我創建片段A.我不知道它是否重要,但片段使用FragmentStatePagerAdapter附加到viewPager。我在EditText中輸入了一些東西。然後我按下一個按鈕創建Fragment B,從viewPager中刪除A,並將Fragment B附加到viewPager。現在在片段B中,EditText包含片段A的文本!爲什麼?

我知道,viewpager結合了每個片段的視圖,但在我的情況下,它不應該,因爲一直只有一個片段。而且我正在父母身上搜索具有唯一ID的EditText視圖。有任何想法嗎?

回答

0

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

我在過去碰到過類似的問題,我一直把我的文本放入錯誤的TextView。我從來沒有嘗試過像你一樣嵌套findById調用,但是當我簡單地通過id搜索TextView時,我通常會得到最先聲明的調用。您可以通過兩種方式解決此問題,第一種方法是使用不同的ID,這需要一些剪切和粘貼操作(可在一定程度上管理)。第二個最佳選擇是創建一個自定義視圖來封裝這個佈局和邏輯。預先定義按鈕的點擊以清除文本並創建一個界面,以顯示需要/必需的位,以使其與代碼的其餘部分正常工作。

+0

我的自定義視圖封裝了清理部分。在自定義視圖中找到正確的EditText,並按鈕清除相應EditText中的文本。我現在發現了一個骯髒的解每當自定義視圖膨脹時,我按ID查找EditText,記住refenece,然後隨機化id。所以當下一個自定義視圖被誇大時,那裏不會是另一個具有相同ID的EditText。 – delegate 2013-02-28 07:11:22

0

我知道這是晚了,但我一直有同樣的問題,我想我已經找到了一個簡單的解決方案。而不是僅僅通過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相同的問題,並且此修復也適用。希望這會幫助任何人有這個問題

0

我有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()); 
} 
相關問題