保持Android按钮选择状态

15

我知道这是一个之前被问过很多次的问题,但是在我的代码中似乎无法解决它。我有两个按钮,当其中一个按钮被按下时,我希望它保持在选定状态,反之亦然。我尝试使用setSelected和setPressed来实现它,但似乎无法让它工作。这是我正在使用的代码:

    region_button.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            objects = category;
            adap.notifyDataSetChanged();
            proximity_button.setPressed(false);
            region_button.setPressed(true);

        }
    });

    proximity_button.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            objects = proximity;
            adap.notifyDataSetChanged();
            region_button.setPressed(false);
            proximity_button.setPressed(true);

        }
    });
编辑: 根据评论,我需要补充说明我有自定义的 XML 背景用于按钮,并且希望保留当前的外观。

1
为什么不直接使用RadioGroup和RadioButton,然后将正确的属性设置到您的RadioButtons中,使用选择器就可以解决问题! - Cehm
5个回答

21

我在谷歌上搜索并找到了这篇 Stack Overflow 帖子:
如何在单击按钮后将一个按钮保持为按下状态?

mycodes_Button.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        mycodes_Button.setPressed(true);
        return true;
    }
});

但是要读一下评论,它非常有趣!


几乎正确-供他人参考,另一个按钮状态也需要设置为false,但是我仍然接受,因为它让我找到了正确的方向。谢谢! - coder
8
使用 setSelected (https://dev59.com/SXE85IYBdhLWcg3wzW3M#3417158) 对我而言效果更好,因为我仍然可以在释放时具有功能。 - richy

4

为什么要使用按钮?在这种情况下,复选框单选框组是最佳解决方案。

checkBox.setChecked(false);

3
如果您不喜欢复选框的用户界面,那就不要使用它。 - Mike D
3
你可以将它更改为任何你想要的东西。 - Dmytro Danylyk
根据需求,是可以的。 - Mike D

3

我知道我来晚了,但我尝试了上面的方法,它仍然像是一个临时状态(除非你想一直按住它)。

对我有效的方法是在XML文件中使用state_selected="true" + 在我的java文件中使用imageButton.setSelected(true)。请参见以下代码:

ibType1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
    ibType1.setSelected(true);
    ibType2.setSelected(false);
}//onClick
});

XML:

<item android:state_selected="true">
<shape android:shape="rectangle">
    <corners android:radius="45dp" />
    <solid android:color="@color/colorAccent" />
    <stroke android:width="1dp" android:color="#000000"/>
</shape>

这将允许您在决定选择另一个图像按钮或按钮之前,通过编程方式选择特定背景状态的图像按钮或按钮。


1
这里有一个想法,禁用按下的按钮并启用其他按钮。让禁用的按钮布局与按下的布局类似。用户会看到它被按下了,但实际上是被禁用了。

0
一个复选框可能可行,但如果你想要一个更接近 iOS 的 UI,可以使用 UISegmentedControl。将所需的所有按钮包装在 LinearLayout 中,然后可以按以下方式操作:
public void onClick( View v ){
    if ( v.getID == R.id.btn1 ) {
        btn1.setEnabled(false);
        btn2.setEnabled(true);
        // do stuff
    }
    else if ( v.getId() == R.id.btn2 ) {
        btn2.setEnabled(false);
        btn1.setEnabled(true);
        // do stuff
    }
}

当然,在您的drawable文件夹中,您可以为每个状态添加背景颜色、边框和其他视觉效果。


我正在寻找类似于iOS上的NSSegmentedControl的外观,但您的解决方案存在问题,即一旦按钮未启用,再次单击它将不起作用。 - coder
@coder 这就是 UIsegmentedControl 的设计理念(之前的错别字是我的失误)。要重新启用一个被禁用的按钮,需要按下另一个按钮。它的功能与单选按钮组完全相同。 - Mike D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接