禁用时更改FAB背景颜色

时间:2016-07-13 03:15:17

标签: android

我试图弄清楚如何在按下后2秒内禁用浮动动作按钮的背景颜色。当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 个答案:

答案 0 :(得分:2)

禁用它时,只需调用fab.setBackgroundColor(Color.GRAY);(或任何颜色)即可。您也可以使用fab.setBackgroundColor(getResources().getColor(R.color.colorAccent0));来使用资源颜色。

答案 1 :(得分:1)

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

我设法通过以下方法(在Kotlin中)更改了FAB的颜色:

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。

答案 2 :(得分:0)

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

首先,我将按钮主题的选择器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代码中,只需在您要定位的按钮(在本例中为fab)上调用setEnabled方法,并使用布尔值来指示在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);

答案 3 :(得分:0)

只需将选择器用作 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