0

我正在实现一个带有 3 个按钮的容器,动态添加。当我选择一个时,我希望取消选择其他的(更改可绘制对象)。这在我将按钮直接添加到我在 XML 中声明的 LinearLayout 时有效。但是当我创建一个扩展 LinearLayout 的自定义布局并将我的按钮放在那里时,它不再起作用(尽管代码几乎相同)。我选择一个按钮并执行取消选择其他按钮的代码,但它们仍然显示选定状态的可绘制对象。

编辑:在这两种情况下,我总是可以选择按钮。选择工作。在自定义视图情况下不起作用的是取消选择视图,或者至少在取消选择视图时不会更改可绘制对象。

我将代码减少到查看问题所需的最低限度。

活动:

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>

图像是 2 个无害的正方形 selected.png 和 not_selected.png,颜色不同。

提前致谢。

4

0 回答 0