จะปิดการใช้งานปุ่ม Android ได้อย่างไร


370

ฉันสร้างเค้าโครงที่มีสองปุ่มถัดไปและก่อนหน้า ในระหว่างปุ่มฉันกำลังสร้างมุมมองแบบไดนามิกบางอย่าง ดังนั้นเมื่อฉันเปิดแอปพลิเคชั่นครั้งแรกฉันต้องการปิดการใช้งานปุ่ม "ก่อนหน้า" เนื่องจากไม่มีมุมมองก่อนหน้านี้ ฉันต้องการปิดใช้งานปุ่ม "ถัดไป" เมื่อไม่มีมุมมองเพิ่มเติมให้แสดง อย่างไรก็ตามมีการปิดใช้งานปุ่มหรือไม่

สกรีนช็อตของเค้าโครงตัวอย่าง

คำตอบ:


800

คุณลองนี่ไหม

myButton.setEnabled(false); 

อัปเดต: ขอบคุณ Gwen เกือบลืมว่าandroid:clickableสามารถตั้งค่าในเค้าโครง XML ของคุณเพื่อตรวจสอบว่าปุ่มสามารถคลิกได้หรือไม่


66
เทียบเท่าคือ android: เปิดใช้งานใน xml
Namratha

1
และคุณพบสิ่งนั้นในเอกสารประกอบที่ไหน คุณสามารถลิงค์ได้ที่นี่
Varun

4
@Namratha จะทำงานเพียงแค่สำหรับ "ปุ่ม" วิดเจ็ตไม่ได้สำหรับ IMAGE ดูเป็นปุ่ม
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
พยายามเข้าใจความรู้สึกของแมตต์ .. ;)
Deepak Sharma

30

ใช่มันสามารถปิดการใช้งานใน XML เพียงแค่ใช้:

<Button
android:enabled="false"
/>

2
นี่คือคำตอบที่แท้จริงสำหรับ xml สิ่งที่ไร้สาระของการล้อเล่นที่คลิกได้นั้นไม่มีอะไรเกี่ยวข้องกับวิธีการวาดปุ่มเพื่อทำให้มันดูไม่ทำงาน
Scott Biggs

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" />

ตอบ 8 ธันวาคม '10 ที่ 7:08 Varun

1
@Poldie: จริง ๆ แล้วถ้าคุณอ่านคำตอบทั้งสองคุณจะเข้าใจว่ามันคล้ายกัน แต่ไม่เท่ากัน
เปาโล Rovelli

9

ในกรณีของฉัน

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

ทำงานได้ดีและเปิดใช้งานและปิดใช้งานปุ่มตามที่ควร แต่เมื่อสถานะปุ่มถูกปิดใช้งานมันจะไม่กลับไปสู่สถานะที่เปิดใช้งานอีกแม้ว่าจะสามารถคลิกได้ ฉันพยายามตรวจสอบและทำให้สดชื่นสถานะ drawable แต่ไม่มีโชค

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()วิธีการตั้งค่าคุณสมบัติปุ่มเป็น

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

ใช้วิธีผิดในการใช้ตัวแปรแทนพารามิเตอร์ !!!

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);

เมื่อมีการคลิกมุมมองวัตถุคลาดูทำให้การเรียกกลับไปยังวิธี onClick () ส่งเป็นพารามิเตอร์ตัวเองดังนั้นพารามิเตอร์มุมมองที่เป็นโมฆะไม่ควรเกิดขึ้นหากมันเป็นข้อผิดพลาดการยืนยันมันอาจเกิดขึ้นเช่นเมื่อวัตถุคลาสดูถูกทำลายในขณะเดียวกัน ตัวอย่างที่เก็บรวบรวมโดย GC) หรือวิธีการแก้ไขเนื่องจากแฮ็ค

เล็กน้อยเกี่ยวกับอินสแตนซ์ของ & null

JLS / 15.20.2 ตัวดำเนินการเปรียบเทียบประเภทของอินสแตนซ์

ณ รันไทม์ผลลัพธ์ของตัวดำเนินการ instanceof เป็นจริงถ้าค่าของ Relational Expression ไม่เป็นโมฆะและการอ้างอิงอาจถูกส่งไปยัง ReferenceType โดยไม่ต้องเพิ่ม ClassCastException

มิฉะนั้นผลที่เป็นเท็จ


สามคำจากผู้เขียน

ถ้าคุณถามทำไม

มากที่สุดเพื่อหลีกเลี่ยง NullPointerException

รหัสอีกเล็กน้อยจะช่วยประหยัดเวลาของคุณในการติดตามบั๊กในภายหลังในรหัสของคุณและลดการเกิดความผิดปกติ

พิจารณาตัวอย่างต่อไปนี้:

View.OnClickListener listener = new OnClickListener() {

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

    }
});

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

2
ดูเหมือนว่าเมื่อใดก็ตามที่มีการเรียกนิพจน์อื่นรหัสก็จะบั๊กแล้ว คุณคาดหวังว่าจะมีปุ่ม แต่มีสิ่งอื่นผ่านไป คุณควรโยนยกเว้นเมื่อไม่ได้เป็นv Button
Jeroen

ไม่ใช่สิ่งที่ฉันหมายถึง แต่เป็นการปรับปรุง
Jeroen

@JeroenBollen eelaborate ได้โปรด :) ok ฉันเห็นเพียงสิ่งเดียวที่ไม่สอดคล้องกันมันเป็นข้อยกเว้นข้อความเกี่ยวกับ "ดูผิดที่ผ่านไปยังวิธีการ" นอกจากนี้ยังเป็นเพียงความพยายามที่จะแสดงว่ามันควรมีลักษณะอย่างไร
ceph3us

ฉันหมายถึงว่าเมื่อฟังก์ชั่นของตัวเองได้รับโมฆะมันเป็นข้อผิดพลาดอยู่แล้วและมันควรจะเป็นข้อยกเว้น
Jeroen

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.