【问题标题】:Change FAB background color when disabled禁用时更改 FAB 背景颜色
【发布时间】:2016-07-13 03:15:16
【问题描述】:

我正在尝试弄清楚如何在浮动操作按钮被禁用 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>

【问题讨论】:

    标签: android


    【解决方案1】:

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

    【讨论】:

    • 在mainactivity中?在哪里?
    • 当你决定改变它是启用还是禁用时,改变那里的颜色。因此,无论是在 fab 代码内部(在这种情况下,fab 必须声明为 final)还是在您的主要活动的 onCreate 或其他方法内部,都将其放在那里。
    【解决方案2】:

    只需使用 as 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
    

    【讨论】:

      【解决方案3】:

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

      首先,我将按钮主题的选择器 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);
      

      【讨论】:

      • 如果您不想在禁用状态下监听按钮的点击,这是正确的方法。例如。如果设备上禁用了 NFC,则应禁用 FAB,但您无法显示提示对话框,将用户引导至“设置”以启用 NFC。
      【解决方案4】:

      看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 resources.getColor(R.color.disabled)

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

      【讨论】:

        猜你喜欢
        • 2016-04-08
        • 1970-01-01
        • 2018-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多