1

複合ビューを使用してフラグメント内の複数の同様のタイプのビューを表示するアプリがあります。これらの複合ビューの 1 つのカスタム パーツは、各複合ビューの CheckBox に設定されたテキストです。フラグメントのライフサイクルがビューのコンテンツを初めて表示するときはすべて問題ありません (各チェックボックスには、属性を使用してフラグメントの xml で指定された正しいテキストがあります) が、その後の各ビュー (向きの変更後またはタブ経由の移動後) では、すべての CheckBox テキスト同じ値 (最後の複合ビューのチェック ボックスのテキスト値) に設定されます。

私の複合ビューのxmlレイアウト情報。 複合ビュー.xml:

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">  
  <CheckBox
    android:id="@+id/myCheckBox" 
    style="@style/CheckBoxLeftAligned" 
    android:checked="false"
  />
  ...
</merge>

各複合ビューのチェックボックスに特定のテキストを設定できるようにする属性ファイル。 属性.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <declare-styleable name="ZZZ">
    <attr name="name"   format="string" />              
  </declare-styleable>
</resources>

4 つの複合ビューを含むフラグメントのレイアウト。 fragment_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<ScrollView
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:ctd="http://schemas.android.com/apk/res/com.xxx.yyy"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical">
  <RelativeLayout 
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <com.xxx.yyy.ui.zzz
      android:id="@+id/aaa"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      ctd:name="@string/aaa"
    />
    <com.xxx.yyy.ui.zzz
      android:id="@+id/bbb"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      ctd:name="@string/bbb"
    />
    <com.xxx.yyy.ui.zzz
      android:id="@+id/ccc"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      ctd:name="@string/ccc"
    />
    <com.xxx.yyy.ui.zzz
      android:id="@+id/ddd"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      ctd:name="@string/ddd"
    />
  </RelativeLayout>
</ScrollView>

私の複合ビューの Java 実装。 zzz.java

package com.xxx.yyy.ui;

... 

public class zzz extends RelativeLayout {

  private static final String TAG = zzz.class.getSimpleName();

  private final Context mContext;

  private CheckBox mLabelCheckBox;


  public zzz(Context context, AttributeSet attrs) {
    super(context, attrs);

    mContext = context;

    initializeLayoutBasics(context);
    processAttributeInformation(context, attrs);


  }

  private void initializeLayoutBasics(Context context) {
    final LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    inflater.inflate(R.layout.composite_view, this);    
  }

  private void processAttributeInformation(Context context, AttributeSet attr) {
    mLabelCheckBox = (CheckBox) findViewById(R.id.myCheckBox);

    final TypedArray a = context.obtainStyledAttributes(attr, R.styleable.ZZZ);
    String text = a.getString(R.styleable.ZZZ_name);
    mLabelCheckBox.setText(text);
    Log.d(TAG, "CheckBox=" + mLabelCheckBox.toString() + ", Title= " + payName);            

    a.recycle();
  }

  ...
}

CatLog 出力

03-10 08:20:31.151: D/MyFragment(400): MyFragment.onAttach
03-10 08:20:31.151: D/MyFragment(400): MyFragment.onCreate
03-10 08:20:31.151: D/MyFragment(400): MyFragment.onCreateView
03-10 08:20:31.200: D/zzz(400): CheckBox=android.widget.CheckBox@40a78e00, Title= MSP
03-10 08:20:31.220: D/zzz(400): CheckBox=android.widget.CheckBox@40a9da58, Title= ISP
03-10 08:20:31.239: D/zzz(400): CheckBox=android.widget.CheckBox@40aa1248, Title= ASP
03-10 08:20:31.250: D/zzz(400): CheckBox=android.widget.CheckBox@40aa4a88, Title= Board Certified Pay
03-10 08:20:31.260: D/zzz(400): CheckBox=android.widget.CheckBox@40aa8310, Title= HPO Board Cert Pay
03-10 08:20:31.270: D/MyFragment(400): MyFragment.onStart
03-10 08:20:31.270: D/MyFragment(400): MyFragment.onResume
03-10 08:20:32.410: D/App(400): onTabUnselected detaching fragment MyFragment
03-10 08:20:32.426: D/App(400): onTabSelected adding fragment OtherFragment
03-10 08:20:32.440: D/MyFragment(400): MyFragment.onPause
03-10 08:20:32.450: D/TotalPayFragment(400): OtherFragment.onCreateView
03-10 08:20:32.519: D/TotalPayFragment(400): OtherFragment.onStart
03-10 08:20:33.120: D/App(400): onTabUnselected detaching fragment OtherFragment
03-10 08:20:33.120: D/App(400): onTabSelected attaching fragment MyFragment
03-10 08:20:33.170: D/MyFragment(400): MyFragment.onCreateView
03-10 08:20:33.190: D/SimplePay(400): CheckBox=android.widget.CheckBox@40acb618, Title= MSP
03-10 08:20:33.201: D/SimplePay(400): CheckBox=android.widget.CheckBox@40ace530, Title= ISP
03-10 08:20:33.210: D/SimplePay(400): CheckBox=android.widget.CheckBox@40ad1c20, Title= ASP
03-10 08:20:33.230: D/SimplePay(400): CheckBox=android.widget.CheckBox@40ad5310, Title= Board Certified Pay
03-10 08:20:33.280: D/SimplePay(400): CheckBox=android.widget.CheckBox@40ad8ad8, Title= HPO Board Cert Pay
03-10 08:20:33.290: D/MyFragment(400): MyFragment.onStart
03-10 08:20:33.290: D/MyFragment(400): MyFragment.onResume

そのため、catlog の出力でさえ、各チェックボックスが、属性を使用してフラグメントの xlm に設定した特定のテキストに設定されていることを示しています。しかし、2 回目にフラグメントが onCreateView を通過した後、すべての CheckBox テキスト値が「HPO Board Cert Pay」に設定されます。この出力は Honeycomb エミュレーターを使用しています。

複合ビューで TextBoxes にテキストを設定するときにこの同じパターンを使用したので、これは Checkboxes と関係があると確信しています。

何かご意見は?

4

2 に答える 2

0

前述のように Android が動作している理由についてはお答えできませんが、以下は私の回避策です。

onResume で以下の関数を作成して呼び出し、複合 UI に forceUpdateOfCheckBoxText メソッドを追加することで、これを回避しました。

  //Used to force checkboxes to be updated
  private void forceUpdateOfCheckboxesInCompositeViews(ViewGroup parent) {    
    for(int i = 0; i < parent.getChildCount(); i++) {
          View child = parent.getChildAt(i);            

          if(child instanceof ViewGroup) {
            Class<?> c = child.getClass();
            if (c == SimplePay.class) {
              ((SimplePay) child).forceUpdateOfCheckBoxText();
            } 
            else {
                forceUpdateOfCheckboxesInCompositeViews((ViewGroup)child);
            }
          }               
      }
  }

これは私の観点からは最適ではありませんが、機能します。

于 2014-01-14T01:40:00.780 に答える