web-dev-qa-db-ja.com

AppCompatでボタンの無効な色を設定するにはどうすればよいですか?

このスタイルを使用して、Buttonの背景色を変更します。

_<style name="AccentButton" parent="Widget.AppCompat.Button.Colored">
    <item name="colorButtonNormal">@color/colorAccent</item>
    <item name="Android:textColor">@color/white</item>
</style>
_

そしてレイアウト:

_    <Button
        Android:id="@+id/login_button"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:text="@string/fragment_login_login_button"
        app:theme="@style/AccentButton"/>
_

できます。しかし、このButtonsetEnabled(false)を呼び出すと、同じ色が維持されます。このケースをどのように管理できますか?

33
Alexandr

Widget.AppCompat.Button.Coloredスタイルを正しく使用していません。親スタイル(Widget.AppCompat.Button.Colored)を使用していますが、それをテーマとして適用しています。これは事実上、Widget.AppCompat.Button.Colored部分が完全に無視され、代わりにボタンのデフォルトの色を変更するだけであることを意味します(これは機能しますが、無効な場合は処理しません)。

代わりに、ThemeOverlayを使用し、Coloredスタイルを個別に適用する必要があります。

<style name="AccentButton" parent="ThemeOverlay.AppCompat.Dark">
   <!-- customize colorButtonNormal for the disable color -->
   <!-- customize colorAccent for the enabled color -->
</style>

<Button
    Android:id="@+id/login_button"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:text="@string/fragment_login_login_button"
    Android:theme="@style/AccentButton"
    style="@style/Widget.AppCompat.Button.Colored"/>

Widget.AppCompat.Button.Coloredスタイルの使用に関するこの回答 で述べたように、無効な色はcolorButtonNormalによって制御され、有効な色はcolorAccentによって制御されます。 ThemeOverlay.AppCompat.Darkを使用すると、textColorが自動的に暗い色に変更されます。つまり、カスタムThemeOverlayはまったく必要ない場合があります。

77
ianhanniballake

受け入れられたソリューションとカスタムウィジェットを組み合わせて、アルファを設定することで無効に見えるボタンを作成できます。これは、ボタンとテキストの色の組み合わせに対して機能するはずです。

public class ButtonWidget extends AppCompatButton {

    public ButtonWidget(Context context) {
        super(context);
    }

    public ButtonWidget(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ButtonWidget(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public void setEnabled(boolean enabled) {
        setAlpha(enabled ? 1 : 0.5f);
        super.setEnabled(enabled);
    }

}
9
Meanman

ボタンに色を使用する代わりに、セレクターで背景を使用する必要があります。こちらがデモコードです

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_enabled="true">
        <shape Android:shape="rectangle">
            <solid Android:color="@color/yourEnabledColor" />
        </shape>
    </item>
    <item Android:state_enabled="false">
        <shape Android:shape="rectangle">
            <solid Android:color="@color/yourDisabledColor" />
        </shape>
    </item>
</selector>
8
Awais Ahmad

現在、Android API 15+に対して次の設定を使用しています。

/res/color/btn_text_color.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
  <item Android:color="#42000000" Android:state_enabled="false" />
  <item Android:color="#ffffff" />
</selector>

/res/values/styles.xml

<style name="ColoredButton" parent="Widget.AppCompat.Button.Colored">
    <item name="Android:textColor">@color/btn_text_color</item>
</style>

そして

<Button
    Android:id="@+id/button"
    style="@style/ColoredButton"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:text="button" />
6
Milan Hlinák

プログラムで変更したら、そのように行動する必要があります。

button = new Button(new ContextThemeWrapper(ActiVityName.this, R.style.AccentButton));

[〜#〜]または[〜#〜]

if (button.isEnabled())
    button.getBackground().setColorFilter(Color.Black, PorterDuff.Mode.MULTIPLY);
else
    button.getBackground().setColorFilter(null);
5
Amit Vaghela

ianhanniballake 'answerおよび Joe Bowbeer 'コメントから拡張された完全なソリューション:

/res/values/styles.xml

<style name="AccentButton" parent="ThemeOverlay.AppCompat.Dark">
    <!-- customize colorAccent for the enabled color -->
    <!-- customize colorControlHighlight for the enabled/pressed color -->
    <!-- customize colorButtonNormal for the disabled color -->
    <item name="Android:buttonStyle">@style/Widget.AppCompat.Button.Colored</item>
</style>

そして、ボタンを使用する場所はどこでも:

<Button
    Android:id="@+id/login_button"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:text="@string/fragment_login_login_button"
    Android:theme="@style/AccentButton"/>

それは本当に良かった

2
Seven

上記の@meanmanの答えのKotlin実装、アルファを調整することははるかに簡単な方法であり、すべてのタッチリップル効果は以前と同じように機能します。

import Android.content.Context
import Android.support.v7.widget.AppCompatButton
import Android.util.AttributeSet

class FadedDisableButton : AppCompatButton {
    constructor(context: Context) : super(context)
    constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
    constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr)

    override fun setEnabled(enabled: Boolean) {
        alpha = when {
            enabled -> 1.0f
            else -> 0.5f
        }
        super.setEnabled(enabled)
    }
}
1
ChrisPrime