안드로이드 버튼을 비활성화하는 방법?


370

다음과 이전의 두 버튼이 포함 된 레이아웃을 만들었습니다. 버튼 사이에서 동적 뷰를 생성하고 있습니다. 따라서 응용 프로그램을 처음 시작할 때 이전보기가 없으므로 "이전"단추를 비활성화하려고합니다. 표시 할 뷰가 더 없을 때 "다음"버튼을 비활성화하고 싶습니다. 어쨌든 버튼을 비활성화 할 수 있습니까?

샘플 레이아웃의 스크린 샷

답변:


800

이것을 시도 했습니까?

myButton.setEnabled(false); 

업데이트 : 그웬에게 감사합니다. android:clickable버튼을 클릭 할 수 있는지 여부를 결정하기 위해 XML 레이아웃에서 설정할 수있는 것을 거의 잊었습니다 .


66
동등한 것은 XML에서 android : enabled입니다.
Namratha

1
그리고 문서에서 어디서 찾았습니까? 여기에 연결할 수 있습니까?
Varun

4
@Namratha 그것은 버튼으로 imageView가 아니라 "버튼"위젯에 대해서만 작동합니다
mehmet

Xamarin 동등 : myButton.Enabled = false;
Cameron Forward

48

레이아웃이 런타임에 설정되어 있기 때문에 XML에서 활성화하거나 비활성화 할 수 없지만로 액티비티를 시작할 때 클릭 할 수 있는지 설정할 수 있습니다 android:clickable.


4
5 년간의 Android 경험과 지금이 사실을 알게되었습니다! : /
Sagar

35

당신은 당신의 활동에서 한 줄의 코드를 작성합니다.

Button btn = (Button) findViewById(R.id.button1);
btn.setEnabled(false);

같은 버튼을 사용하려면 그냥 쓰십시오.

Button btn = (Button) findViewById(R.id.button1);
btn.setEnabled(true);

20
2 개 라인. 이것은 하나입니다. ((Button)findViewById(R.id.mybutton)).setEnabled(false);
Matt Clark

34
감정 매트를 이해하려고 노력 ..)
디팍 샤르마에게

30

예, 다음을 사용하여 XML에서 비활성화 할 수 있습니다.

<Button
android:enabled="false"
/>

2
이것은 xml에 대한 진정한 대답입니다. 클릭 할 수있는 내용에 대한 혼란스러운 말은 버튼이 비활성화 된 것처럼 보이도록하는 방법과 관련이 없습니다.
Scott Biggs 17

1
AS / IDEA 코드 완성은 android:enabled입력을 시작할 때 제안하지 않기 때문에 사람들은 당신이 이것을 할 수 없다고 생각한다고 생각 합니다. (현재까지도)
Kevin Krumwiede

1
나는 단지 코드에서 작동하지 않는 노력 setEnabled하고있다
FindOutIslamNow

23

Java에서는 버튼에 대한 참조가 있으면

Button button = (Button) findviewById(R.id.button);

버튼을 활성화 / 비활성화하려면 다음 중 하나를 사용할 수 있습니다.

button.setEnabled(false);
button.setEnabled(true);

또는:

button.setClickable(false);
button.setClickable(true);

처음부터 버튼을 비활성화하려면 button.setEnabled (false); onCreate 메소드에서. 그렇지 않으면 XML에서 직접 사용할 수 있습니다.

android:clickable = "false"

그래서:

<Button
        android:id="@+id/button"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="@string/button_text"
        android:clickable = "false" />

생성

1
@Poldie : 사실, 두 개의 답변을 읽으면 그것들이 꽤 비슷하지만 같지 않다는 것을 이해할 것입니다.
Paolo Rovelli

9

나의 경우에는,

myButton.setEnabled(false);
myButton.setEnabled(true);

제대로 작동하고 버튼을 정상적으로 활성화 및 비활성화합니다. 그러나 일단 버튼 상태가 비활성화되면 클릭 할 수는 있지만 다시 활성화 상태로 돌아 가지 않습니다. 드로어 블 상태를 무효화하고 새로 고치려고했지만 운이 없습니다.

myButton.invalidate();
myButton.refreshDrawableState();

당신이나 비슷한 문제가있는 사람이라면 저에게 맞는 배경을 다시 그릴 수 있습니다. 모든 API 레벨에서 작동합니다.

myButton.setEnabled(true);
myButton.setBackgroundDrawable(activity.getResources().getDrawable(R.drawable.myButtonDrawable));

8

Kotlin에서 버튼으로 id를 참조하면 버튼을 다음과 같이 활성화 / 비활성화하십시오

layout.xml

<Button
   android:id="@+id/btn_start"
   android:layout_width="100dp"
   android:layout_height="50dp"
   android:text="@string/start"
   android:layout_alignParentBottom="true"/>

activity.kt

  btn_start.isEnabled = true   //to enable button
  btn_start.isEnabled = false  //to disable button

2

xml에서 처음으로 버튼을 android:clickable="false"

<Button
        android:id="@+id/btn_send"
        android:clickable="false"/>

그런 다음 코드에서 oncreate()메서드 내부 에서 button 속성을

btn.setClickable(true);

그런 다음 버튼 클릭으로 코드를

btn.setClickable(false);

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    btnSend = (Button) findViewById(R.id.btn_send);
    btnSend.setClickable(true);
    btnSend.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            btnSend.setClickable(false);

        }
    });
}

2

변수가있는 매개 변수를 사용하는 LISTENER의 잘못된 방법 !!!

btnSend.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        btnSend.setClickable(false);

    }
});

올바른 방법 :

btnSend.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {

        /** check given view  by assertion or cast as u wish */
        if(v instance of Button) {

            /** cast */
            Button button = (Button) v;

            /** we can perform some check up */
            if(button.getId() == EXPECTED_ID) {

                /** disable view */
                button.setEnabled(false)            
                button.setClickable(false); 
            }

        } else {

             /** you can for example find desired view by root view  */
             Button bt = (Button) v.getRootView().findViewById(R.id.btId);

             /*check for button */
             if(bt!=null) {

                 /** disable button view */
                 ...
             } else {
                 /** according to @jeroen-bollen remark
                   * we made assumption that we expected a view
                   * of type button here in other any case  
                   */
                  throw new IllegalArgumentException("Wrong argument: " +
                         "View passed to method is not a Button type!");
             }
          }
       }
    });

편집 : @ jeroen-bollen에 대한 회신

 View.OnClickListener 

인터페이스 정의 뷰를 클릭했을 때 콜백을 호출하기위한이.

메소드 정의

void onClick(View v);

뷰를 클릭하면 View 클래스 객체가 onClick () 메소드를 콜백하여 매개 변수 자체로 전송하므로 Assertion Error 인 경우 null 뷰 매개 변수가 발생하지 않아야합니다. 예 : View 객체 클래스가 파괴 된 경우) GC에 의해 수집 된 예)

instanceof & null 에 대해 조금

JLS / 15.20.2. 유형 비교 연산자 instanceof

런타임시 RelationalExpression의 값이 널이 아니고 ClassCastException을 발생시키지 않고 Reference를 ReferenceType으로 캐스트 할 수있는 경우 instanceof 연산자의 결과는 true입니다.

그렇지 않으면 결과는 false 입니다.


저자의 세 단어

왜 물어?

NullPointerException을 피하는 것이 좋습니다

코드를 조금만 추가하면 나중에 코드에서 버그를 추적하는 데 시간이 절약되고 수백만의 발생이 줄어 듭니다.

다음 예제를 고려하십시오.

View.OnClickListener listener = new OnClickListener() {

    @Override
    public void onClick(View v) {
        btnSend.setClickable(false);

    }
});

btnSend.setOnClickListener(listener)
btnCancel.setOnClickListener(listener)  

2
else 표현식이 호출 될 때마다 코드에 이미 버그가있는 것 같습니다. 버튼이 필요했지만 다른 것이 전달되었습니다. 당신은 해야 할 때 예외가 발생 v하지 않은 것입니다 Button.
Jeroen

내가 의미하는 것은 아니지만 그래도 개선.
Jeroen

@JeroenBollen eelaborate please :) ok 일관성이없는 한 가지만 "잘못된 뷰가 메소드에 전달되었습니다"에 대한 예외 메시지입니다. 게다가 어떻게 보이는지 보여주는 것입니다.
ceph3us

함수 자체가 null을 받으면 이미 버그이므로 예외가 발생해야합니다.
Jeroen

1

코 틀린과 함께라면

// to disable clicks
myButton.isClickable = false 

// to disable button
myButton.isEnabled = false

// to enable clicks
myButton.isClickable = true 

// to enable button
myButton.isEnabled = false
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.