このスタイルを使用して、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"/>
_
できます。しかし、このButton
でsetEnabled(false)
を呼び出すと、同じ色が維持されます。このケースをどのように管理できますか?
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
はまったく必要ない場合があります。
受け入れられたソリューションとカスタムウィジェットを組み合わせて、アルファを設定することで無効に見えるボタンを作成できます。これは、ボタンとテキストの色の組み合わせに対して機能するはずです。
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);
}
}
ボタンに色を使用する代わりに、セレクターで背景を使用する必要があります。こちらがデモコードです
<?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>
現在、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" />
プログラムで変更したら、そのように行動する必要があります。
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);
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"/>
それは本当に良かった
上記の@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)
}
}