0

動的に追加された 3 つのボタンを持つコンテナーを実装しています。1つを選択すると、他のものが選択解除されます(ドローアブルを変更します)。これは、XML で宣言した LinearLayout にボタンを直接追加すると機能します。しかし、LinearLayout を拡張するカスタム レイアウトを作成し、そこにボタンを配置すると、機能しなくなります (コードはほとんど同じですが)。1 つのボタンを選択すると、他のボタンの選択を解除するコードが実行されますが、選択された状態のドローアブルが引き続き表示されます。

編集:どちらの場合も、いつでもボタンを選択できます。選択が機能します。カスタム ビューのケースで機能しないのは、ビューの選択を解除することです。または、ビューの選択を解除しても、少なくともドローアブルは変更されません。

問題を確認するのに必要な最小限のコードに減らしました。

アクティビティ:

public class TestActivity extends Activity {

private View[] views;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.test);

/////////////////////////////////////////////////////////////////
//uncomment this block to see the working code (without custom layout)
//      views = new View[3];
//      LinearLayout root = (LinearLayout) findViewById(R.id.container);
//      findViewById(R.id.myCustomLayout).setVisibility(View.GONE);
//      addButton(root, 0);
//      addButton(root, 1);
//      addButton(root, 2);
//////////////////////////////////////////////////////////////////
}

private void addButton(final ViewGroup root, final int position) {
    View v = new View(this);
    LinearLayout.LayoutParams viewLayoutPars = new LinearLayout.LayoutParams(150, 200);
    v.setLayoutParams(viewLayoutPars);

    v.setBackgroundResource(R.drawable.mybg);

    if (position == 0) {
        v.setSelected(true);
    }

    root.addView(v);

    views[position] = v;

    v.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            for (View view : views) {
                view.setSelected(false);
            }
            v.setSelected(true);
            root.invalidate();
        }
    });
}

}

レイアウト ファイル:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/container"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
>

    <com.test.MyCustomLayout
        android:id="@+id/myCustomLayout"
        xmlns:dg="http://schemas.android.com/apk/res/com.test"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        />

</LinearLayout>

私のカスタムレイアウト:

public class MyCustomLayout extends LinearLayout {
private Context context;

private View[] views;

public MyCustomLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
    this.context = context;

    views = new View[3];
}

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    super.onLayout(changed, l, t, r, b);

    addButton(0);
    addButton(1);
    addButton(2);
}

private void addButton(final int position) {
    View v = new View(context);
    LinearLayout.LayoutParams viewLayoutPars = new LinearLayout.LayoutParams(150, 200);
    v.setLayoutParams(viewLayoutPars);

    v.setBackgroundResource(R.drawable.mybg);

    if (position == 0) {
        v.setSelected(true);
    }

    addView(v);

    views[position] = v;

    v.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            for (View view : views) {
                view.setSelected(false);
            }
            v.setSelected(true);
            invalidate();
        }
    });
}
}

ドローアブル (mybg):

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true" android:drawable="@drawable/selected" />
    <item android:drawable="@drawable/not_selected" />
</selector>

画像は、色の異なる selected.png と not_selected.png の 2 つの無害な正方形です。

前もって感謝します。

4

0 に答える 0