我正在实现一个带有 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,颜色不同。
提前致谢。