2017-08-22 247 views
2

兩個視圖恢復片段我有一個複雜的佈局來實現。 它有19個部分可以顯示或不基於用戶以前輸入的大量參數。 爲了簡化代碼並且不顯示未使用的部分,佈局是動態創建的。與具有相同ID

一切都是片段內。 片段有一個用作容器的LinearLayout,當創建片段時,我生成所有必需的片段。

每個部分由自己的本地適配器,它負責誇大這一部分的佈局,並把它添加到容器管理。

一切工作完全正常。問題是2個部分具有完全相同的結構,因此他們共享相同的xml佈局。因爲這兩個部分的內部視圖具有相同的ID。這不是問題,因爲該部分是在其適配器本地管理的。 當我進入下一個片段然後回到這個片段時,會出現問題。系統試圖恢復視圖的以前的狀態,並且由於這兩個部分具有相同的ID,所以當第二部分被恢復時,其值也被設置爲第一部分。

是否有來管理或告訴片段無法恢復的狀態(如一切手工重新載入反正)的任何解決方案。

這裏是當前結構的光例如:

片段XML

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"/> 

部XML

<EditText xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/section_text" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"/> 

片段代碼

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.fragment_layout, container, false); 

    if (<condition>) 
     createSection1(getContext(),view); 

    if (<condition>)   
     createSection2(getContext(),view); 

    return view; 
} 


private void createSection1(Context context, ViewGroup root){ 
    Section1Adapter adapter = new Section1Adapter(context, root); 
    // ... 
} 

private void createSection2(Context context, ViewGroup root){ 
    Section2Adapter adapter = new Section2Adapter(context, root); 
    // ... 
} 

適配器代碼(兩個同樣的想法)

public Section2Adapter(LayoutInflater inflater, ViewGroup root) { 

    View view = LayoutInflater.from(context).inflate(R.layout.section_layout, root, false); 

    initView(view); 

    root.addView(view); 
} 

回答

2

您的問題,爲你正確地說,是,基本上,你在這個狀態: enter image description here

你需要什麼要做的,就是告訴Android你自己在SparseArray中哪個鍵保存的狀態,其中EditText。基本上,你需要得到這樣的:

enter image description here

,通過它您實現這一目標是在this amazing article很好的解釋,由帕夏杜德卡的機制。 (學分他漂亮的圖像,也可以)

只要搜索「查看ID應該是唯一」的文章中,你將有你的答案。

您的特定情況的解決方案的要點是下列之一:

  • ,那麼可以繼承LinearLayout S.T.你的CustomLinearLayout會知道該小組屬於何時其狀態。這樣,您可以保存所有子狀態的部分專用只爲那款SparseArray內,並添加專用SparseArray全球SparseArray(就像圖像中)
  • 你也可以繼承EditText,S.T.您的CustomEditText知道它屬於哪個部分,並且會將其狀態保存在SparseArray的自定義密鑰中 - 例如, section_text_Section1爲第一部分,section_text_Section2對於第二個

就個人而言,我更喜歡第一個版本,因爲它會工作,即使你以後添加更多人觀看您的部分。第二種方法不能處理更多的視圖,因爲在第二種情況下,智能狀態保存不是父對象,而是視圖本身。

希望這會有所幫助。

+0

Wahoo!令人驚歎的答案! Thx非常,因爲我不知道這一點。這正是我所期待的。 – Eselfar