2017-08-22 7 views
2

私は実装する複雑なレイアウトを持っています。 このセクションには、ユーザーが以前に入力した多数のパラメータに基づいて表示することも、表示しないこともできる19個のセクションがあります。 コードを簡素化し、未使用のセクションを表示しないために、レイアウトは動的に作成されます。同じIDを持つビューが2つあるフラグメントを復元する

すべてが断片の中にあります。 フラグメントには、コンテナとして使用されるLinearLayoutがあり、フラグメントが作成されると、必要なすべてのセクションが生成されます。

各セクションは、このセクションのレイアウトを膨らませてコンテナに追加する独自のローカルアダプタによって管理されます。

すべてが問題なく動作します。問題は、2つのセクションが同じ構造を持ち、同じxmlレイアウトを共有していることです。そのため、両方のセクションの内部ビューは同じIDを持ちます。これは、セクションがそのアダプタでローカルに管理されるため、問題ではありません。 問題は、次のフラグメントに行ってからこのフラグメントに戻ったときに表示されます。システムはビューの以前の状態を回復しようとします。これらの2つのセクションは同じIDを持つため、2つ目のセクションが復元されると、その値も最初のビューに設定されます。

これを管理したり、状態を復元しないようにフラグメントを通知する方法はありますか(すべてを手動で再読み込みするため)。ここ

は、現在の構造の光一例である。

フラグメント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

どのような鍵でSparseArrayEditTextの状態を保存するには、Android自身に伝えることです。基本的に、あなたはこれを取得する必要があります。

enter image description here

あなたは、これは非常によくパシャDudkaにより、this amazing articleに説明されて実現するメカニズム。

記事の「ビューIDは一意にする必要があります」を検索するだけで、あなたの答えが得られます。

あなたの特定の状況のた​​めのソリューションの要旨は、次のいずれかです。

  • あなたがLinearLayout S。T.をサブクラス化することができますあなたのCustomLinearLayoutは、その状態が子供が属するセクションを知るでしょう。この方法は、あなたがグローバル
  • (単に画像のように)SparseArrayあなたがEditTextをサブクラスすることができ、そのセクションのためだけに専用のSparseArrayのセクション内のすべての子の状態を保存し、に専用のSparseArrayを追加することができ、S。T. CustomEditTextはどのセクションに属しているかを知り、その状態をカスタムキーでSparseArrayに保存します。それはあなたが後でセクションに複数のビューを追加しても動作しますので、個人的には第二1

ための最初のセクションのためのsection_text_Section1、そしてsection_text_Section2は、私は、最初のバージョンを好みます。 2番目のビューは、2番目のビューでは機能しません。これは、スマートな状態保存を行う親ではなく、ビュー自体です。

これが役に立ちます。

+0

Wahoo!驚くべき答え! Thxは私がそれについて知らなかったのと非常によく似ています。これはまさに私が探していたものです。 – Eselfar

関連する問題