Làm cách nào để tắt nút Android?


371

Tôi đã tạo một bố cục có chứa hai nút, Tiếp theo và Trước đó. Ở giữa các nút tôi đang tạo một số chế độ xem động. Vì vậy, khi tôi khởi chạy ứng dụng lần đầu tiên, tôi muốn tắt nút "Trước đó" vì sẽ không có bất kỳ chế độ xem nào trước đó. Tôi cũng muốn tắt nút "Tiếp theo" khi không có nhiều lượt xem để hiển thị. Có cách nào để vô hiệu hóa các nút?

ảnh chụp màn hình bố trí mẫu

Câu trả lời:


801

Bạn đã thử điều này?

myButton.setEnabled(false); 

Cập nhật: Cảm ơn Gwen. Hầu như quên rằng android:clickablecó thể được đặt trong bố cục XML của bạn để xác định xem một nút có thể nhấp được hay không.


66
tương đương là android: được kích hoạt trong xml.
Namratha

1
Và bạn đã tìm thấy điều đó trong tài liệu ở đâu? Bạn có thể liên kết nó ở đây?
Varun

4
@Namratha nó chỉ hoạt động cho các widget "Nút", không phải cho imageView dưới dạng nút
mehmet

Xamarin tương đương: myButton.Enables = false;
Cameron Forward

48

Bạn không thể bật hoặc tắt nó trong XML của mình (vì bố cục của bạn được đặt trong thời gian chạy), nhưng bạn có thể đặt nếu nó có thể nhấp khi khởi chạy hoạt động với android:clickable.


4
5 năm kinh nghiệm trong Android và tôi biết về điều này NGAY BÂY GIỜ! : /
Sagar

35

Bạn chỉ cần viết một dòng mã trong hoạt động của mình

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

Khi bạn muốn kích hoạt cùng một nút, chỉ cần viết

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

20
Đó là 2 dòng. Đây là một. ((Button)findViewById(R.id.mybutton)).setEnabled(false);
Matt Clark

34
Cố gắng hiểu cảm xúc Matt ..;)
Deepak Sharma

30

Có, nó có thể bị vô hiệu hóa trong XML chỉ bằng cách sử dụng:

<Button
android:enabled="false"
/>

2
Đây là câu trả lời thực sự cho xml. Tất cả những điều vô nghĩa của việc gây rối với clickable không liên quan gì đến cách nút được vẽ để làm cho nó trông bị vô hiệu hóa.
Scott Bigss

1
Tôi nghĩ mọi người nghĩ bạn không thể làm điều này vì việc hoàn thành mã AS / IDEA không đề xuất android:enabledkhi bạn bắt đầu nhập nó. (Ngay cả cho đến ngày nay.)
Kevin Krumwiede

1
Tôi đã thử nó không hoạt động, chỉ từ mã setEnabledđang hoạt động
FindOutIslamNow

23

Trong Java, một khi bạn có tham chiếu của nút:

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

Để bật / tắt nút, bạn có thể sử dụng:

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

Hoặc là:

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

Vì bạn muốn tắt nút ngay từ đầu, bạn có thể sử dụng button.setEnables (false); trong phương thức onCreate. Mặt khác, từ XML, bạn có thể trực tiếp sử dụng:

android:clickable = "false"

Vì thế:

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

đã trả lời 8 tháng 12 'lúc 7:08 Varun

1
@Poldie: Thật ra, nếu bạn đọc hai câu trả lời bạn sẽ hiểu chúng khá giống nhau nhưng không bằng nhau.
Paolo Rovelli

9

Trong trường hợp của tôi,

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

đang hoạt động tốt và nó đang kích hoạt và vô hiệu hóa nút như bình thường. Nhưng một khi trạng thái nút bị vô hiệu hóa, nó sẽ không bao giờ quay lại trạng thái kích hoạt nữa, mặc dù nó có thể nhấp được. Tôi đã thử vô hiệu hóa và làm mới trạng thái có thể vẽ, nhưng không có may mắn.

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

Nếu bạn hoặc bất cứ ai gặp vấn đề tương tự, điều làm việc cho tôi là thiết lập lại nền có thể vẽ được. Hoạt động trên mọi cấp độ API.

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

8

Trong Kotlin, nếu bạn giới thiệu Chế độ xem nút với id thì hãy bật / tắt nút như

layout.xml

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

hoạt động.kt

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

2

đầu tiên trong xml làm nút như android:clickable="false"

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

sau đó trong mã của bạn, oncreate()phương thức bên trong đặt thuộc tính nút là

btn.setClickable(true);

Sau đó, bên trong nút bấm thay đổi mã vào

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

CÁCH SAU TRONG DANH SÁCH SỬ DỤNG LẮP ĐẶT LỚP CỦA PARAMETER !!!

btnSend.setOnClickListener(new OnClickListener() {

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

    }
});

ĐÚNG CÁCH:

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!");
             }
          }
       }
    });

EDIT: Trả lời @ jeroen-bollen

 View.OnClickListener 

định nghĩa Giao diện cho một cuộc gọi lại được gọi khi một chế độ xem được nhấp.

với định nghĩa phương thức

void onClick(View v);

khi chế độ xem được nhấp, đối tượng lớp View sẽ gọi lại phương thức onClick () gửi dưới dạng tham số, do đó, tham số null sẽ không xảy ra nếu đó là Lỗi xác nhận , ví dụ như khi lớp đối tượng View bị hủy ví dụ được thu thập bởi GC) hoặc phương thức đã bị can thiệp do hack

một chút về thể hiện & null

JLS / 15.20.2. Kiểu toán tử so sánh

Trong thời gian chạy, kết quả của toán tử instanceof là đúng nếu giá trị của RelationalExpression không phải là null và tham chiếu có thể được truyền tới ReferenceType mà không cần nâng ClassCastException.

Nếu không thì kết quả là sai .


ba từ của tác giả

NẾU U HỎI TẠI SAO?

NHẤT để TRÁNH NullPulumException

Ít mã hơn sẽ tiết kiệm thời gian của bạn cho việc theo dõi lỗi sau này trong mã của bạn và giảm sự xuất hiện của các từ ngữ.

xem xét ví dụ sau:

View.OnClickListener listener = new OnClickListener() {

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

    }
});

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

2
Có vẻ như bất cứ khi nào biểu thức khác sẽ được gọi, mã đã bị lỗi. Bạn đang mong đợi một Nút nhưng một cái gì đó khác đã được thông qua. Bạn nên ném một ngoại lệ khi vkhông phải là một Button.
Jeroen

Tôi không hoàn toàn có ý gì, nhưng dù sao cũng là một sự cải tiến.
Jeroen

@JeroenBollen eelabISE vui lòng :) ok tôi chỉ thấy một điều không nhất quán đó là thông báo ngoại lệ về "quan điểm sai được truyền cho phương thức". Bên cạnh đó, nó chỉ là một nỗ lực để hiển thị nó trông như thế nào.
ceph3us

Ý tôi là khi hàm tự nhận null, nó đã là một lỗi và nó sẽ đưa ra một ngoại lệ.
Jeroen

1

Với Kotlin bạn có thể làm,

// to disable clicks
myButton.isClickable = false 

// to disable button
myButton.isEnabled = false

// to enable clicks
myButton.isClickable = true 

// to enable button
myButton.isEnabled = false
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.