ボタンをグレー表示する方法は?


103

以下のように定義されたボタンがあります。無効にしたい場合はを使用しますがmy_btn.setEnabled(false)、グレー表示にしたいと思います。どうやってやるの?

ありがとう

<Button android:id="@+id/buy_btn" style="@style/srp_button" />

style / srp_button

<style name="srp_button" parent="@android:style/Widget.Button">
    <item name="android:background">@drawable/btn_default</item>
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:textColor">#ffffff</item>
    <item name="android:textSize">14sp</item>
    <item name="android:typeface">serif</item>
    <item name="android:paddingLeft">30dp</item>
    <item name="android:paddingRight">30dp</item>
    <item name="android:paddingTop">5dp</item>
    <item name="android:paddingBottom">5dp</item>
</style>

drawable / btn_default.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/pink" />
    <corners android:radius="6dp" />
</shape>

2
セレクタを使用します
Buda Gavril

回答:


57

btn_defaut.xmlセレクタとして、3つまたは4つの状態を提供する必要があります。

  1. 押された状態
  2. デフォルトの状態
  3. フォーカス状態
  4. 有効化された状態(誤った表示のある無効化状態。コメントを参照)

それに応じて、州に効果と背景を提供します。

詳細な説明は次のとおりです:異なる色の標準のAndroidボタン


それでそれを灰色にするために、私は背景の色と無効状態のテキストの色を変更する必要がありますか?透明な前景を追加する方法はありませんか?
2012年

3
うん!あなたがそれに提供するandroid:state_disable="true"ものは、ボタンが無効にされたときの状態を表示します、簡単で推奨される方法です。
Adil Soomro、2012年

無効状態のテキストの色はどこで指定できますか?:それは背景のみを指定することができるようです...私は、そのための新しい質問尋ねstackoverflow.com/questions/8743584/...
7月

17
ありませんandroid:state_disable="true"、ありますか?あなたは言及していandroid:state_enabled="false"ますか?
13

@MarcoW .:はい、あなたは絶対的に正しいです。間違った属性の謝罪。
Adil Soomro 2013

171

また、アルファを設定して(半透明にする)、無効にしたように見せることもできます。これは、ボタンの背景が画像であり、その状態を作成したくない場合に特に便利です。

button.setAlpha(.5f);
button.setClickable(false);

更新:上記のソリューションをKotlinの前に、私が新人だったときに書きました。これは「迅速で汚れた」解決策ですが、専門的な環境ではお勧めしません。

今日、状態リストを作成せずにボタン/ビューで機能する一般的なソリューションが必要な場合は、Kotlin拡張機能を作成します。

fun View.disable() {
    getBackground().setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY)
    setClickable(false)
}

Javaでは、静的util関数と同様のことができ、ビューを変数として渡すだけで済みます。それほどきれいではありませんが、動作します。


4
私は、setAlphaの呼び出しはCPUに負荷がかかることを読みました。誰か確認できますか?
Ali Kazi

@AliKaziそれはあなたのタイプに依存しますViewこのG +ポスト:「あなたのビューは、描画コマンドの重複が含まれていない場合は、setAlpha()離れて最適化されており、私たちは、単にペイントが適切なアルファを適用するオブジェクトを修正する場合に発生します。View.hasOverlappingRendering()リターンが真。ImageViewsおよびTextViewno背景描画可能でSは、このための一般的な候補であります最適化。この状況にある場合は、必要なだけ使用setAlpha()してください。」
スーフィアン2016年

1
@スーフィアンありがとう。しかし、より安全にするために、私は各ボタンの単純なStateListDrawableに依存しました。私がそれをした方法、私は新しい答えとして投稿しました。アルファはパフォーマンスにとって悪いことを知った場所へのリンクを含めました。
Ali Kazi 2016年

視覚的にユーザー
ファリド2018

ビューを実際に視覚的に無効にします。ありがとう@Siavash
Akash Bisariya

54

最も簡単な解決策は、ここでように、ボタンの背景画像にカラーフィルターを設定することです。

あなたは次のように行うことができます:

if ('need to set button disable')
    button.getBackground().setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY);
else
    button.getBackground().setColorFilter(null);

私が誰かを助けたことを願っています...


私はこのアプローチが一番好きです。ありがとう!
2014年

2
このアプローチには可能性がありますが、結果として得られる色は、必ずしも予想通りではありません。たとえば、グレーの色が乗算されたオレンジ色のボタンは、色あせたオレンジ色ではなく、濃い赤色になります。
誰かどこか

4
多分Mode.SRC_IN乗算の代わりに使用する必要があります。stackoverflow.com/a/17112876/550471を
Someone Somewhere

これは機能しますが、混合すると2つの色が別の色に変わります
Shamsul Arefin Sajib

驚くばかり!とてもきれい。
Milind Chaudhary

21

与えられたすべての回答は問題なく機能しますが、setAlphaの使用はパフォーマンスの点で悪いアイデアになる可能性があることを覚えています(詳細はこちら)したがって、StateListDrawableを作成することは、ボタンの無効な状態を管理するためのより良いアイデアです。方法は次のとおりです。

res / drawableフォルダーにXML btn_blue.xmlを作成します。

<!-- Disable background -->
<item android:state_enabled="false"
      android:color="@color/md_blue_200"/>

<!-- Enabled background -->
<item android:color="@color/md_blue_500"/>

res / values / styles.xmlにボタンスタイルを作成します。

<style name="BlueButton" parent="ThemeOverlay.AppCompat">
      <item name="colorButtonNormal">@drawable/btn_blue</item>
      <item name="android:textColor">@color/md_white_1000</item>
</style>

次に、このスタイルをボタンに適用します。

<Button
     android:id="@+id/my_disabled_button"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:theme="@style/BlueButton"/>

btnBlue.setEnabled(true)OR を呼び出すとbtnBlue.setEnabled(false)、状態の色が自動的に切り替わります。


12

Clickableをfalseに設定し、背景色を次のように変更します。

callButton.setClickable(false);
callButton.setBackgroundColor(Color.parseColor("#808080"));

12

無効なボタンのXMLファイルを作成する必要があります(drawable / btn_disable.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/grey" />
    <corners android:radius="6dp" />
</shape>

ボタンのセレクターを作成します(drawable / btn_selector.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/btn_disable" android:state_enabled="false"/>
    <item android:drawable="@drawable/btn_default" android:state_enabled="true"/>
    <item android:drawable="@drawable/btn_default" android:state_pressed="false" />

</selector>

ボタンにセレクターを追加する

<style name="srp_button" parent="@android:style/Widget.Button">
    <item name="android:background">@drawable/btn_selector</item>
</style>


1

私はそのためにこのコードを使用しました:

ColorMatrix matrix = new ColorMatrix();
matrix.setSaturation(0);
ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix);
profilePicture.setColorFilter(filter);

0

上記の解決策を試しましたが、どれもうまくいきませんでした。私は次のオプションで行きました:

<!-- button_color_selector.xml -->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/colorAccent" android:state_enabled="true"/>
    <item android:color="@color/colorAccentLight" android:state_enabled="false"/>
</selector>
<com.google.android.material.button.MaterialButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:backgroundTint="@color/button_color_selector"
                .../>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.