当禁用时更改FAB背景颜色

11

我正在尝试弄清楚如何在浮动操作按钮被按下后禁用2秒的持续时间内更改其背景颜色。当2秒结束时,我还希望它返回到原来的颜色。

这是按下时出现两秒延迟的代码。此代码位于MainActivity中的一个片段中。

 appBar.setExpanded(true, true);
 fab.setVisibility(View.VISIBLE);
 fab.setImageResource(R.drawable.ic_phone_white_18dp);

 fab.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
     fab.setClickable(false);
     Timer buttonTimer = new Timer();
     buttonTimer.schedule(new TimerTask() {
       @Override
       public void run() {
         runOnUiThread(new Runnable() {
           @Override
           public void run() {
             fab.setClickable(true);
           }
         });
       }
     }, 2000);

我已经尝试使用文档中的StateListDrawable方法进行调整,但没有找到有效的方法。

这是 FAB 的颜色主题的 XML。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/themeColorPressed" android:state_pressed="true"/>
    <item android:color="@color/themeColorPressed" android:state_checked="true"/>
    <item android:color="@color/themeColorPressed" android:state_selected="true"/>
    <item android:color="@color/themeColorPressed" android:state_enabled="false"/>
    <item android:color="@color/themeColor" android:state_enabled="true"/>
</selector>
4个回答

5
只需使用选择器 app:backgroundTint,如下所示:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:color="...." android:state_enabled="true"/>
  <item android:alpha="..." android:color="...."/>
</selector>

然后在你的代码中使用:

fab.isEnabled = true
fab.isEnabled = false

1
这是同一个人对这个问题更详细的回答: stackoverflow.com/a/63429217/2016562 - undefined

4

当您禁用按钮时,只需调用fab.setBackgroundColor(Color.GRAY);(或其他颜色)。您还可以使用fab.setBackgroundColor(getResources().getColor(R.color.colorAccent0));来使用资源颜色。


在MainActivity中?在哪里? - William Macleod
无论何时您决定更改启用或禁用状态,请在那里更改颜色。因此,无论是在fab代码内(在这种情况下,fab必须声明为final),还是在主活动的onCreate或另一个方法内部,请将其放在那里。 - TheAnonymous010

2

我刚刚发现了一些很好的东西...

首先,我将按钮主题选择器XML中的setEnabled()方法至少移动到颜色声明之前,就像这样。

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

<item android:color="@color/themeColorPressed" android:state_pressed="true"/>
<item android:color="@color/themeColorPressed" android:state_checked="true"/>
<item android:color="@color/themeColorPressed" android:state_selected="true"/>
<item android:color="@color/grey" android:state_enabled="false"/>
<item android:color="@color/themeColor"/>

将其最初设置为false,以便为所分配的颜色进行设置。

然后在Java代码中,只需调用setEnabled方法来针对所选按钮(在此示例中为fab),并使用布尔值来指示其在onClick方法中是已激活还是已停用:

                                fab.setClickable(false);
                                fab.setEnabled(false);
                                Timer buttonTimer = new Timer();
                                buttonTimer.schedule(new TimerTask() {
                                    @Override
                                    public void run() {
                                        runOnUiThread(new Runnable() {
                                            @Override
                                            public void run() {
                                                fab.setClickable(true);
                                                fab.setEnabled(true);
                                            }
                                        });
                                    }
                                }, 2000);

如果您不想在禁用状态下监听按钮的点击,则这是正确的方法。例如,如果设备上禁用了NFC,则应禁用FAB,但是您无法显示警报对话框,引导用户进入设置以启用NFC。 - marienke

1

查看FloatingActionButton的实现,不支持fab.setBackgroundColor(int color)方法。

我使用以下方法成功改变了FAB的颜色(Kotlin代码):

private fun toggleFabEnabled(enabled: Boolean){
    fab.isEnabled = enabled
    if (enabled){
        fab.backgroundTintList = ColorStateList.valueOf(resources.getColor(R.color.colorAccent, null))
    } else {
        fab.backgroundTintList = ColorStateList.valueOf(resources.getColor(R.color.disabled, null))
    }
}

对于 API < 23,请使用以下方法获取颜色:resources.getColor(R.color.disabled)

我处理不同的 API 方法是创建一个 Kotlin 扩展函数来处理所有的 API。


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