【问题标题】:How to toggle only the background of a button and save the state (pressed or not)如何仅切换按钮的背景并保存状态(按下或未按下)
【发布时间】:2021-07-10 13:49:45
【问题描述】:

我正在尝试制作一个调查应用程序,了解一下 FragmentContainerView 和导航图。当我使用现有的小部件(例如单选按钮或复选框)作为答案时,一切都很完美。

当我尝试制作自己的小部件或更改普通按钮的行为以使其行为如以下屏幕截图所示时出现问题:

该行为类似于 ToggleButton,但我不想更改文本(开/关文本)。我需要的是,当我点击按钮时,它被标记为选中(更改背景),当然,我需要能够稍后询问按钮是否被选中。

使用 Button 和自定义选择器,将按钮设置为 checkable 我可以实现预期的行为。

选择器(btn_toggle_background.xml):

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <!--When Button is not enabled -->
    <item android:state_checked="false" android:color="#eeeeee" />
    <!--When Button is in pressed state -->
    <item android:state_checked="true" android:color="@color/blue_electric" />
    <!--When Button is in selected state -->
    <!--Default Background Color -->
    <item android:color="#eeeeee" />

</selector>

在 XML 布局中:

 <?xml version="1.0" encoding="utf-8"?>

 <Button
      android:id="@+id/button2"
      android:layout_width="match_parent"
      android:layout_height="60dp"
      android:backgroundTint="@drawable/btn_toggle_background" <!-- CUSTOM SELECTOR -->
      android:textColor="@drawable/btn_toggle_text" <!-- CUSTOM SELECTOR -->
      android:checkable="true" <!-- CHECKABLE HERE -->
      android:gravity="fill|fill_horizontal"
      android:text="A través de mi compañía de seguros"
      android:textAlignment="gravity"
      android:textAllCaps="false"
      app:icon="@android:drawable/btn_radio"
      app:iconTint="@drawable/btn_toggle_icon" <!-- CUSTOM SELECTOR --> />

但是按钮不再响应 OnClick 事件(我怀疑它是为了使其可检查)。我假设它会响应 OnCheckedChange 事件,但它是一个不会触发普通按钮的事件。

我还尝试从 Button 扩展自定义视图并拦截 OnClick 并通过自定义侦听器(接口)发送事件。在这种情况下,按钮行为不再起作用。它变成一个普通按钮,并忽略 XML 中为选中状态指定的样式和选择器。

是否有一个看起来像我需要的小部件?从 ToggleButton 扩展会更合适吗?

【问题讨论】:

    标签: java android android-button material-components-android


    【解决方案1】:

    你可以使用:

            <com.google.android.material.button.MaterialButton
                android:checkable="true"
                app:backgroundTint="@drawable/btn_toggle_background"
                .../>
    

    与:

    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_checked="false" android:color="#eeeeee" />
        <item android:state_checked="true" android:color="@color/...." android:alpha="xxx" />
    </selector>
    

    还有OnCheckedChangeListener

        button.addOnCheckedChangeListener { button, isChecked ->
            if (isChecked){
                //
            }
        }
    

    使用isChecked方法了解状态:

    button.isChecked
    

    【讨论】:

    • 这正是我所需要的。我不知道 MaterialButton 触发了那个事件。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多