【问题标题】:change color of my ToggleButton when clicked单击时更改我的 ToggleButton 的颜色
【发布时间】:2019-07-30 19:16:06
【问题描述】:

我有一些切换按钮代表一周中的日子。

当用户点击ToggleButton 时,我希望它切换状态并改变颜色,向用户表明它已被点击。

这是我的ToggleButtons 之一的样子:

<ToggleButton
    android:id="@+id/toggleButton_monday"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="8dp"
    android:layout_marginLeft="8dp"
    android:layout_marginTop="16dp"
    android:background="@drawable/button_border"
    android:textOff="MON"
    android:textOn="MON"
    app:layout_constraintEnd_toStartOf="@+id/toggleButton_tuesday"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/textView10" />

我希望按钮在单击后看起来像这样(我想要相同的边框和形状,但只是改变了不同的颜色和状态):


答案here 不起作用,因为我的切换按钮已经有一个android:background,用于在按钮周围显示自定义边框。

答案here 不起作用,因为我使用的是ToggleButton 而不是SwitchCompat


编辑:

这是当前的android:background,我将ToggleButtons 设置为:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
    <corners
        android:radius="10dp"
        />
    <solid
        android:color="#FFFFFF"
        />
    <padding
        android:left="0dp"
        android:top="0dp"
        android:right="0dp"
        android:bottom="0dp"
        />
    <size
        android:width="75dp"
        android:height="40dp"
        />
    <stroke
        android:width="3dp"
        android:color="#878787"
        />
</shape>

编辑:解决方案

谢谢@Broken 和@Moustafa Shahin,我结合了他们的答案。

首先,我为我的 ToggleButtons toggle_button_default.xmltoggle_button_checked.xml 创建了两个资源文件(在第一个 EDIT 中检查上面的代码)。基本上,两个 XML 中的背景颜色不同。

其次,我创建了一个名为 toggle_button_state.xml 的选择器,并加载了我在上面创建的相应资源文件:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- WHEN IS CHECKED -->
    <item android:drawable="@drawable/toggle_button_default" android:state_checked="false" />

    <!-- WHEN IS NOT CHECKED -->
    <item android:drawable="@drawable/toggle_button_checked" android:state_checked="true" />

</selector>

最后,对于我的 ToggleButtons,我将 toggle_button_state 设置为它们的背景:

<ToggleButton
    android:id="@+id/toggleButton_monday"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="8dp"
    android:layout_marginLeft="8dp"
    android:layout_marginTop="8dp"
    android:background="@drawable/toggle_button_state"
    android:textOff="MON"
    android:textOn="MON"/>

在 Activity 中,我有一个 onClick 方法,我可以用它来监控点击:

class RentActivity : AppCompatActivity(), View.OnClickListener {
    override fun onClick(v: View?) {
        when(v?.id){
            R.id.toggleButton_monday ->{
                Toast.makeText(this, "Monday Clicked", Toast.LENGTH_LONG).show()
                return
            }
     ...

【问题讨论】:

    标签: android android-layout togglebutton


    【解决方案1】:

    您可以创建 2 个后台资源文件并根据状态更改它们:

    ToggleButton toggle = (ToggleButton) findViewById(R.id.togglebutton);
    toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked) {
            // The toggle is enabled
            //the background resource which mean status is enable
        } else {
            // The toggle is disabled
            //the background resource which mean status is disabled
        }
    }
    

    });

    【讨论】:

    • 嗯,我会尝试一下,但有没有更好的方法来做到这一点,因为我有 7 个切换按钮。所以打电话给setOnCheckedChangeListener 7 次似乎很多
    • 您可以添加带有 switch case 的 onclick 函数以获取 clicke 切换 id 并尝试此解决方案,如果您不想创建这样的侦听器 ans here
    【解决方案2】:

    您必须在 drawable 目录中创建包含状态列表的新文件。

    您可以将其命名为toggle_background.xml

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <!-- WHEN IS CHECKED -->
        <item android:drawable="@color/colorPrimary" android:state_checked="false" />
    
        <!-- WHEN IS NOT CHECKED -->
        <item android:drawable="@color/colorAccent" android:state_checked="true" />
    
    </selector>
    

    以上文件您可以用作background of ToggleButton

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <ToggleButton
            android:id="@+id/toggleButton_monday"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/toggle_background"
            android:textOff="ON"
            android:textOn="OFF" />
    
    </LinearLayout>
    

    默认情况下按钮有灰色边框。您想什么时候删除它只需添加:

    style="?android:attr/borderlessButtonStyle"
    

    到您的ToggleButton xml 文件中。

    您也可以添加OnCheckedChangeListener。如果您有很多按钮,您可以将它们全部添加到列表中,并在循环中为所有按钮添加相同的侦听器:

    import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.support.v7.app.AppCompatActivity;
    import android.widget.CompoundButton;
    import android.widget.ToggleButton;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class MainActivity extends AppCompatActivity {
    
        private List<ToggleButton> listOfButtons = new ArrayList<>();
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            // Add ToggleButtons to list
            listOfButtons.add(findViewById(R.id.toggleButton_monday));
    
            // Create listener for all of them
            CompoundButton.OnCheckedChangeListener listener = (buttonView, isChecked) -> {
                // Do something
            };
    
    
            // Add listener to all od buttons
            for (ToggleButton button : listOfButtons) {
                button.setOnCheckedChangeListener(listener);
            }
        }
    }
    
    

    【讨论】:

    • 是的,但我目前已经有一个背景,可以给我的按钮一个边框。如果我使用这种方法,我会失去我的边界
    • 哦,实际上,在toggle_background.xml 中再次查看您的代码后,我可以在&lt;item android:drawable= 中使用2 个不同的资源文件吗?
    • 是的,当按钮被 NOT 选中时,您使用的是state_checked="false"。和state_checked="true" 当按钮被选中时。
    • @Barcode 你想什么时候去掉灰色边框就加:style="?android:attr/borderlessButtonStyle"
    【解决方案3】:

    如果您正在寻找一种优雅的方式来执行此操作,您可能想尝试使用 GridView....

    <GridView
        android:id="@+id/gridview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:columnWidth="100dp"
        android:numColumns="auto_fit"
        android:verticalSpacing="24dp"
        android:horizontalSpacing="10dp"
        android:stretchMode="spacingWidthUniform"
        />
    

    ...这将允许您以一种让您更轻松地迭代它们的方式使用项目填充布局。您可以创建一个自定义适配器并将其分配给 gridview:

    GridView gridview = findViewById(R.id.gridview);
    MyCustomAdapter _Adapter = new MyCustomAdapter(getApplicationContext());
    gridview.setAdapter(_Adapter);
    

    这将允许您在一个地方为所有按钮设置一个 onClickListener:

    gridview.setOnItemClickListener((parent, view, position, id) -> {
            _Adapter.toggleItem(position);
        });
    

    您可以找到有关创建自定义 gridview 适配器 here 的深入教程

    【讨论】:

      猜你喜欢
      • 2014-09-30
      • 2021-03-16
      • 1970-01-01
      • 2021-03-21
      • 2012-12-06
      • 1970-01-01
      • 1970-01-01
      • 2018-10-25
      • 2021-07-07
      相关资源
      最近更新 更多