버튼을 회색으로 표시하는 방법은 무엇입니까?


103

아래와 같이 정의 된 버튼이 있습니다. 비활성화하려면을 사용 my_btn.setEnabled(false)하지만 회색으로 표시하고 싶습니다. 어떻게 할 수 있습니까?

감사

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

스타일 / 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>

답변:


57

btn_defaut.xml선택기로 3 개 또는 4 개의 상태를 제공해야합니다 .

  1. 눌러 진 상태
  2. 기본 상태
  3. 초점 상태
  4. 활성화 상태 (잘못된 표시가있는 비활성화 상태, 주석 참조)

그에 따라 주에 대한 효과와 배경을 제공합니다.

자세한 설명은 다음과 같습니다. 색상이 다른 표준 Android 버튼


회색으로 표시하려면 배경색과 비활성화 상태의 텍스트 색상을 변경해야합니까? 투명한 전경을 추가하는 방법이 없습니까?
jul.

3
네! 당신이 제공하는 android:state_disable="true"것은 버튼이 비활성화되었을 때의 상태를 보여줄 것입니다. 쉽고 권장되는 방법입니다.
Adil Soomro

비활성화 상태의 텍스트 색상은 어디에서 지정할 수 있습니까? 배경 만 지정할 수있는 것 같습니다 ... 이에 대한 새로운 질문을했습니다 : stackoverflow.com/questions/8743584/…
jul

17
android:state_disable="true"없습니까? 당신이 말하는 android:state_enabled="false"건가요?
caw

@MarcoW .: 네 당신은 절대적으로 맞습니다. 잘못된 속성에 대해 사과드립니다.
Adil Soomro

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()true를 반환합니다. ImageViews와 TextView어떤 배경 당김와이야있는이 공통 후보자 이런 상황 setAlpha()이라면 원하는만큼 사용 하세요. ".
Sufian

1
@Sufian 감사합니다. 그러나 더 안전한 편이 되려면 각 버튼에 대해 간단한 StateListDrawable에 의존했습니다. 내가 어떻게했는지, 나는 새로운 답변으로 게시했습니다. 알파가 성능에 좋지 않다는 것을 알게 된 링크를 포함했습니다.
알리 카지

시각적으로 사용자 친화적이지 않음
Farid

실제로 시각적으로보기를 비활성화합니다. 감사합니다 @ 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
이 접근 방식에는 잠재력이 있지만 결과 색상이 항상 예상되는 색상은 아닙니다. 예를 들어, 회색 색상이 곱해진 주황색 버튼은 희미한 주황색이 아니라 진한 빨간색이됩니다.
Someone Somewhere

4
Mode.SRC_INMultiply 대신 사용해야 할 수도 있습니다. 참조 stackoverflow.com/a/17112876/550471
어딘가의 누군가가

이것은 작동하지만, 두 가지 색상 때 다른 색상으로 혼합 턴
샴술 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로 설정하고 backgroung 색상을 다음과 같이 변경하십시오.

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

12

비활성화 된 버튼 ( drawable / btn_disable.xml )에 대한 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.