複合ビューを使用してフラグメント内の複数の同様のタイプのビューを表示するアプリがあります。これらの複合ビューの 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 と関係があると確信しています。
何かご意見は?