แอตทริบิวต์ android: onClick XML แตกต่างจาก setOnClickListener อย่างไร


416

จากที่ฉันอ่านคุณสามารถกำหนดonClickตัวจัดการให้กับปุ่มได้สองวิธี

การใช้android:onClickแอ็ตทริบิวต์ XML ที่คุณเพียงแค่ใช้ชื่อของวิธีสาธารณะด้วยลายเซ็นvoid name(View v)หรือโดยใช้setOnClickListenerวิธีการที่คุณผ่านวัตถุที่ใช้OnClickListenerอินเตอร์เฟซ หลังมักจะต้องมีระดับที่ไม่ระบุชื่อซึ่งส่วนตัวผมไม่ชอบ (รสนิยมส่วนตัว) OnClickListenerหรือการกำหนดชั้นภายในที่ดำเนินการ

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


4
ฉันอ่านปัญหาของคุณและฉันคิดว่าคุณติดอยู่ในที่เดียวกันเหมือนฉัน ฉันเจอวิดีโอที่ดีมากซึ่งช่วยฉันได้มากในการแก้ไขปัญหาของฉัน ค้นหาวิดีโอบนลิงค์ต่อไปนี้: youtube.com/watch?v=MtmHURWKCmg&feature=youtu.beฉันหวังว่านี่จะช่วยคุณได้เช่นกัน :)
user2166292

9
สำหรับผู้ที่ต้องการประหยัดเวลาในการดูวิดีโอที่โพสต์ในความคิดเห็นด้านบนมันจะแสดงให้เห็นว่าปุ่มสองปุ่มสามารถมีวิธีการเดียวกันสำหรับonClickแอตทริบิวต์ในไฟล์เลย์เอาต์ได้อย่างไร View vนี่คือทำเพื่อขอบคุณพารามิเตอร์ คุณเพียงตรวจสอบif (v == findViewById(R.id.button1)) ฯลฯ ..
CodyBugstein

13
@ Imray ฉันคิดว่ามันจะดีกว่าที่จะใช้v.getId() == R.id.button1เนื่องจากคุณไม่จำเป็นต้องค้นหาการควบคุมที่แท้จริงและทำการเปรียบเทียบ และคุณสามารถใช้ไอเอฟเอswitchแทนจำนวนมาก
Sami Kuhmonen

3
บทช่วยสอนนี้จะช่วยคุณได้มาก คลิกที่นี่
c49

การใช้ xml android: onClick ทำให้เกิดความผิดพลาด

คำตอบ:


604

ไม่ได้ว่าเป็นไปไม่ได้ด้วยรหัส Android ใช้OnClickListenerสำหรับคุณเมื่อคุณกำหนดandroid:onClick="someMethod"คุณลักษณะเท่านั้น

ตัวอย่างโค้ดสองชุดนั้นเท่ากันเพียงนำไปใช้ในสองวิธีที่แตกต่างกัน

การติดตั้งโค้ด

Button btn = (Button) findViewById(R.id.mybutton);

btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        myFancyMethod(v);
    }
});

// some more code

public void myFancyMethod(View v) {
    // does something very interesting
}

OnClickListenerดังกล่าวข้างต้นเป็นการนำรหัสของ และนี่คือการใช้งาน XML

การใช้งาน XML

<?xml version="1.0" encoding="utf-8"?>
<!-- layout elements -->
<Button android:id="@+id/mybutton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Click me!"
    android:onClick="myFancyMethod" />
<!-- even more layout elements -->

ในพื้นหลัง Android ไม่ทำอะไรนอกจากรหัส Java เรียกวิธีการของคุณในเหตุการณ์คลิก

โปรดทราบว่าด้วย XML ด้านบน Android จะมองหาonClickวิธีการmyFancyMethod()เฉพาะในกิจกรรมปัจจุบัน สิ่งนี้เป็นสิ่งสำคัญที่ต้องจำหากคุณใช้แฟรกเมนต์เนื่องจากแม้ว่าคุณจะเพิ่ม XML ข้างต้นโดยใช้แฟรกเมนต์ Android จะไม่มองหาonClickวิธีการใน.javaไฟล์ของแฟรกเมนต์ที่ใช้เพื่อเพิ่ม XML

อีกสิ่งสำคัญที่ฉันสังเกตเห็น ที่คุณกล่าวถึงคุณไม่ต้องการที่ไม่ระบุชื่อวิธีการ คุณหมายถึงว่าคุณไม่ชอบที่ไม่ระบุชื่อชั้นเรียน


4
ฉันไม่ใช่กูรู Java แต่ใช่ฉันหมายถึงคลาสที่ไม่ระบุชื่อ ขอบคุณสำหรับการตอบกลับของคุณ. ชัดเจนมาก
emitrax

118
โปรดทราบว่าหากคุณใช้ XML onclick คุณจะต้องวางเมธอด onclick ( myFancyMethod()) ในกิจกรรมปัจจุบัน สิ่งนี้มีความสำคัญหากคุณใช้แฟรกเมนต์เนื่องจากวิธีการตั้งค่าโปรแกรมฟัง onclick อาจจะมีวิธีการจัดการการคลิกในส่วนของ onCreateView () ... ซึ่งจะไม่พบถ้าถูกอ้างถึงจาก XML
Peter Ajtai

12
ใช่ต้องเป็นวิธีสาธารณะ
Octavian A. Damiean

12
สิ่งที่น่าสนใจคือการทำในโค้ดช่วยให้ผู้ใช้สามารถป้องกันวิธีการเข้าถึงโดยการทำให้วิธีการเป็นส่วนตัวในขณะที่การทำวิธี xml นำไปสู่การสัมผัสของวิธีการ
bgse

5
ความจริงที่ว่าฟังก์ชั่น (ในวิธีการ XML) จะต้องอยู่ในกิจกรรมที่มีความสำคัญไม่เพียง แต่เมื่อคุณพิจารณาชิ้นส่วน แต่ยังมุมมองที่กำหนดเอง (ที่มีปุ่ม) เมื่อคุณมีมุมมองที่กำหนดเองซึ่งคุณนำมาใช้ใหม่ในหลายกิจกรรม แต่คุณต้องการใช้วิธีการ onClick แบบเดียวกันสำหรับทุกกรณีวิธี XML นั้นไม่ใช่วิธีที่สะดวกที่สุด คุณจะต้องใส่ onClickMethod นี้ (ด้วยเนื้อหาเดียวกัน) ในทุกกิจกรรมที่ใช้มุมมองที่กำหนดเองของคุณ
Bartek Lipinski

87

เมื่อฉันเห็นคำตอบด้านบนมันทำให้ฉันตระหนักว่าปัญหาของฉันไม่ได้ใส่พารามิเตอร์ (ดู v) ในวิธีแฟนซี:

public void myFancyMethod(View v) {}

เมื่อพยายามเข้าถึงจาก xml เราควรใช้

android:onClick="myFancyMethod"/>

หวังว่าจะช่วยใครซักคน


74

android:onClick ใช้สำหรับ API ระดับ 4 เป็นต้นไปดังนั้นหากคุณกำหนดเป้าหมาย <1.6 คุณจะไม่สามารถใช้งานได้


33

ตรวจสอบว่าคุณลืมใส่วิธีสาธารณะหรือไม่!


1
ทำไมจึงต้องเปิดเผยให้สาธารณะ
eRaisedToX

3
@eRaisedToX ฉันคิดว่ามันค่อนข้างชัดเจน: ถ้าไม่ใช่แบบสาธารณะก็ไม่สามารถเรียกได้จากกรอบของ Android
m0skit0

28

การระบุandroid:onClickผลลัพธ์แอ็ตทริบิวต์ในการButtonโทรsetOnClickListenerภายใน ดังนั้นจึงไม่มีความแตกต่างอย่างแน่นอน

หากต้องการความเข้าใจที่ชัดเจนให้เราดูว่าonClickมีการจัดการแอตทริบิวต์XML โดยกรอบงานอย่างไร

เมื่อไฟล์เลย์เอาต์ถูกขยายมุมมองทั้งหมดที่ระบุในนั้นจะถูกสร้างอินสแตนซ์ ในกรณีเฉพาะนี้Buttonอินสแตนซ์ถูกสร้างขึ้นโดยใช้ตัวpublic Button (Context context, AttributeSet attrs, int defStyle)สร้าง แอ็ตทริบิวต์ทั้งหมดในแท็ก XML ถูกอ่านจากบันเดิลรีซอร์สและส่งผ่านAttributeSetไปยังตัวสร้าง

Buttonclass ได้รับการสืบทอดจากViewคลาสซึ่งส่งผลให้ตัวViewสร้างถูกเรียกใช้ซึ่งดูแลการตั้งค่า call call handler กลับมาทางsetOnClickListenerคลิก

นี้ OnClick แอตทริบิวต์ที่กำหนดไว้ในattrs.xmlก็จะเรียกใน View.java R.styleable.View_onClickเป็น

นี่คือรหัสView.javaที่ใช้งานได้ดีที่สุดสำหรับคุณโดยการโทรออกsetOnClickListenerด้วยตัวเอง

 case R.styleable.View_onClick:
            if (context.isRestricted()) {
                throw new IllegalStateException("The android:onClick attribute cannot "
                        + "be used within a restricted context");
            }

            final String handlerName = a.getString(attr);
            if (handlerName != null) {
                setOnClickListener(new OnClickListener() {
                    private Method mHandler;

                    public void onClick(View v) {
                        if (mHandler == null) {
                            try {
                                mHandler = getContext().getClass().getMethod(handlerName,
                                        View.class);
                            } catch (NoSuchMethodException e) {
                                int id = getId();
                                String idText = id == NO_ID ? "" : " with id '"
                                        + getContext().getResources().getResourceEntryName(
                                            id) + "'";
                                throw new IllegalStateException("Could not find a method " +
                                        handlerName + "(View) in the activity "
                                        + getContext().getClass() + " for onClick handler"
                                        + " on view " + View.this.getClass() + idText, e);
                            }
                        }

                        try {
                            mHandler.invoke(getContext(), View.this);
                        } catch (IllegalAccessException e) {
                            throw new IllegalStateException("Could not execute non "
                                    + "public method of the activity", e);
                        } catch (InvocationTargetException e) {
                            throw new IllegalStateException("Could not execute "
                                    + "method of the activity", e);
                        }
                    }
                });
            }
            break;

อย่างที่คุณเห็นsetOnClickListenerเรียกให้ลงทะเบียนการโทรกลับตามที่เราทำในรหัสของเรา ความแตกต่างเพียงอย่างเดียวคือใช้Java Reflectionเรียกวิธีการโทรกลับที่กำหนดไว้ในกิจกรรมของเรา

นี่คือเหตุผลสำหรับปัญหาที่กล่าวถึงในคำตอบอื่น ๆ :

  • วิธีการโทรกลับควรเป็นสาธารณะ : เนื่องจากJava Class getMethodถูกใช้งานจะมีการค้นหาเฉพาะฟังก์ชันที่มีตัวระบุการเข้าถึงสาธารณะเท่านั้น มิฉะนั้นจะพร้อมที่จะจัดการIllegalAccessExceptionข้อยกเว้น
  • ในขณะที่ใช้ปุ่มด้วย onClick in Fragment การโทรกลับควรถูกกำหนดในกิจกรรม : การgetContext().getClass().getMethod()โทรจะ จำกัด การค้นหาวิธีการตามบริบทปัจจุบันซึ่งเป็นกิจกรรมในกรณีของส่วน ดังนั้นวิธีการค้นหาภายในชั้นเรียนกิจกรรมและไม่ได้ชั้นส่วน
  • วิธีการโทรกลับควรยอมรับพารามิเตอร์ดู : เนื่องจากJava Class getMethodค้นหาวิธีที่ยอมรับView.classเป็นพารามิเตอร์

1
นั่นคือสิ่งที่ขาดหายไปสำหรับฉัน - Java ใช้ Reflection เพื่อค้นหาตัวจัดการการคลิกที่เริ่มต้นด้วย getContext () เป็นเรื่องลึกลับสำหรับฉันว่าการคลิกจะแพร่กระจายจากส่วนหนึ่งไปยังกิจกรรมอย่างไร
Andrew Queisser

15

มีคำตอบที่ดีมากที่นี่ แต่ฉันต้องการเพิ่มหนึ่งบรรทัด:

ในandroid:onclickXML, Android ใช้การสะท้อนจาวาอยู่เบื้องหลังเพื่อจัดการสิ่งนี้

และตามที่อธิบายไว้ที่นี่การสะท้อนกลับจะทำให้ประสิทธิภาพลดลงเสมอ (โดยเฉพาะกับ Dalvik VM) การลงทะเบียนonClickListenerเป็นวิธีที่ดีกว่า


5
แอปช้าลงมากแค่ไหน? :) ครึ่งมิลลิวินาที ไม่ได้ เมื่อเทียบกับรูปแบบพองตัวจริงมันเหมือนขนนกและปลาวาฬ
Konrad Morawski

14

โปรดทราบว่าหากคุณต้องการใช้คุณสมบัติ onClick XML วิธีการที่สอดคล้องกันควรมีหนึ่งพารามิเตอร์ซึ่งชนิดควรตรงกับวัตถุ XML

ตัวอย่างเช่นปุ่มจะเชื่อมโยงกับวิธีการของคุณผ่านสตริงชื่อandroid:onClick="MyFancyMethod"แต่การประกาศวิธีการควรจะแสดง: ...MyFancyMethod(View v) {...

หากคุณพยายามที่จะเพิ่มคุณสมบัตินี้ให้กับรายการเมนูมันจะมีรูปแบบที่แน่นอนเหมือนกันในไฟล์ XML แต่วิธีการของคุณจะถูกประกาศเป็น:...MyFancyMethod(MenuItem mi) {...


6

อีกวิธีในการตั้งค่าของคุณในฟังคลิกก็คือการใช้ XML เพียงเพิ่มแอนดรอยด์: แอตทริบิวต์ onClick ในแท็กของคุณ

เป็นวิธีปฏิบัติที่ดีในการใช้แอตทริบิวต์ xml“ onClick” เหนือคลาส Java ที่ไม่ระบุชื่อเมื่อใดก็ตามที่เป็นไปได้

ก่อนอื่นให้ดูความแตกต่างของรหัส:

แอตทริบิวต์ XML / onClick แอตทริบิวต์

ส่วน XML

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/button1" 
    android:onClick="showToast"/>

ส่วนของ Java

public void showToast(View v) {
    //Add some logic
}

Java Class แบบไม่ระบุชื่อ / setOnClickListener

ส่วน XML

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

ส่วนของ Java

findViewById(R.id.button1).setOnClickListener(
    new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //Add some logic
        }
});

นี่คือประโยชน์ของการใช้แอตทริบิวต์ XML บนคลาส Java ที่ไม่ระบุชื่อ:

  • ด้วยคลาส Java แบบไม่ระบุชื่อเราจะต้องระบุ id สำหรับองค์ประกอบของเราเสมอ แต่ด้วย ID แอตทริบิวต์ XML สามารถละเว้นได้
  • ด้วยคลาส Java แบบไม่ระบุชื่อเราจะต้องค้นหาองค์ประกอบที่อยู่ในมุมมอง (ส่วน findViewById) อย่างแข็งขัน แต่ด้วยแอตทริบิวต์ XML ที่ Android ทำเพื่อเรา
  • คลาส Java แบบไม่ระบุชื่อต้องการรหัสอย่างน้อย 5 บรรทัดดังที่เราเห็น แต่ด้วยโค้ด XML attribute 3 บรรทัดก็เพียงพอแล้ว
  • ด้วยคลาส Java แบบไม่ระบุชื่อเราจะต้องตั้งชื่อวิธีการของเรา“ onClick” แต่ด้วยคุณสมบัติ XML เราสามารถเพิ่มชื่อใด ๆ ที่เราต้องการซึ่งจะช่วยในการอ่านรหัสของเราได้อย่างมาก
  • แอตทริบิวต์ Xml“ onClick” ได้รับการเพิ่มโดย Google ในระหว่างการเปิดตัว API ระดับ 4 ซึ่งหมายความว่ามันเป็นรูปแบบที่ทันสมัยกว่าเล็กน้อยและรูปแบบที่ทันสมัยกว่าแทบจะดีกว่าเสมอ

แน่นอนว่าเป็นไปไม่ได้เสมอที่จะใช้แอตทริบิวต์ Xml นี่คือสาเหตุที่เราไม่เลือก:

  • หากเรากำลังทำงานกับเศษเล็กเศษน้อย สามารถเพิ่มแอตทริบิวต์ onClick ให้กับกิจกรรมเท่านั้นดังนั้นหากเรามีส่วนย่อยเราจะต้องใช้คลาสที่ไม่ระบุชื่อ
  • หากเราต้องการย้ายผู้ฟัง onClick ไปยังคลาสที่แยกต่างหาก (บางทีถ้ามันซับซ้อนมากและ / หรือเราต้องการใช้มันในส่วนต่าง ๆ ของแอปพลิเคชันของเรา) ดังนั้นเราไม่ต้องการใช้แอตทริบิวต์ xml ทั้ง.

และโปรดทราบว่าฟังก์ชั่นที่เรียกใช้โดยใช้แอตทริบิวต์ XML ควรเป็นแบบสาธารณะเสมอและหากมีการประกาศว่าเป็นไก่ส่วนตัวมันจะส่งผลให้เกิดข้อยกเว้น
Bestin John

5

ด้วย Java 8 คุณอาจใช้วิธีการอ้างอิงเพื่อบรรลุสิ่งที่คุณต้องการ

สมมติว่านี่เป็นonClickตัวจัดการเหตุการณ์ของคุณสำหรับปุ่ม

private void onMyButtonClicked(View v) {
    if (v.getId() == R.id.myButton) {
        // Do something when myButton was clicked
    }
}

จากนั้นคุณผ่านonMyButtonClickedการอ้างอิงวิธีการอินสแตนซ์ในการ setOnClickListener()โทรแบบนี้

Button myButton = (Button) findViewById(R.id.myButton);
myButton.setOnClickListener(this::onMyButtonClicked);

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

PS สำหรับผู้ที่อยากรู้ว่าฉันจะใช้คุณสมบัติภาษา Java 8 ใน Android จริง ๆ ได้อย่างไรมันเป็นมารยาทของห้องสมุดretrolambda


5

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

ใช่คุณสามารถสร้างfragmentหรือactivityนำไปใช้งานได้View.OnClickListener

และเมื่อคุณเริ่มต้นวัตถุมุมมองใหม่ของคุณในรหัสที่คุณสามารถทำได้ mView.setOnClickListener(this);

และสิ่งนี้จะตั้งค่ามุมมองวัตถุทั้งหมดในรหัสให้ใช้onClick(View v)วิธีการที่คุณfragmentหรือactivityมีอยู่โดยอัตโนมัติ

เพื่อแยกมุมมองที่เรียกว่าonClickเมธอดคุณสามารถใช้คำสั่ง switch กับv.getId()เมธอด

คำตอบนี้แตกต่างจากคำว่า "ไม่ว่าเป็นไปไม่ได้ด้วยรหัส"


4
   Add Button in xml and give onclick attribute name that is the name of Method.
   <!--xml --!>
   <Button
  android:id="@+id/btn_register"
  android:layout_margin="1dp"
  android:onClick="addNumber"
  android:text="Add"
  />


    Button btnAdd = (Button) findViewById(R.id.mybutton); btnAdd.setOnClickListener(new View.OnClickListener() {
   @Override
    public void onClick(View v) {
      addNumber(v);
    }
    });

  Private void addNumber(View v){
  //Logic implement 
    switch (v.getId()) {
    case R.id.btnAdd :
        break;
     default:
        break;
    }}

3

สนับสนุนคำตอบของ Ruivo ใช่คุณต้องประกาศวิธีการเป็น "สาธารณะ" เพื่อให้สามารถใช้ใน XML onclick ของ Android - ฉันกำลังพัฒนาแอปเป้าหมายจาก API ระดับ 8 (minSdk ... ) ถึง 16 (targetSdk ... )

ฉันได้ประกาศวิธีการของฉันเป็นแบบส่วนตัวและมันทำให้เกิดข้อผิดพลาดเพียงแค่ประกาศว่ามันใช้งานได้ดีในที่สาธารณะ


ปรากฏว่าตัวแปรที่ประกาศในคลาสการโฮสต์ของกิจกรรมไม่สามารถใช้ในขอบเขตของการโทรกลับที่ประกาศไว้ Bundle Activity.mBundle จะโยน IllegalStateException / NullPointerException หากใช้ใน myFancyMethod ()
Quasaur

2

โปรดใช้ความระมัดระวังแม้ว่าandroid:onClickXML น่าจะเป็นวิธีที่สะดวกในการจัดการคลิกที่การดำเนินการทำอะไรบางอย่างเพิ่มเติมกว่าการเพิ่มsetOnClickListener onClickListenerอันที่จริงมันทำให้คุณสมบัติมุมมองclickableเป็นจริง

ในขณะที่มันอาจจะไม่เป็นปัญหาสำหรับการใช้งาน Android ส่วนใหญ่ตามตัวสร้างโทรศัพท์ปุ่มจะใช้ค่าเริ่มต้นเป็นคลิกได้ = จริงเสมอ แต่ตัวสร้างอื่น ๆ ในโทรศัพท์บางรุ่นอาจมีค่าเริ่มต้น = = เท็จในมุมมองปุ่ม

ดังนั้นการตั้งค่า XML ไม่เพียงพอคุณต้องคิดตลอดเวลาเพื่อเพิ่ม android:clickable="true"ปุ่มที่ไม่ใช่และถ้าคุณมีอุปกรณ์ที่ค่าเริ่มต้นคือคลิกได้ = จริงและคุณลืมแม้แต่ครั้งเดียวที่จะใส่แอตทริบิวต์ XML นี้คุณจะไม่สังเกตเห็น ปัญหาที่รันไทม์ แต่จะได้รับข้อเสนอแนะในตลาดเมื่อมันจะอยู่ในมือของลูกค้าของคุณ!

นอกจากนี้เราไม่สามารถมั่นใจได้ว่าผู้พิทักษ์จะทำให้งงงวยและเปลี่ยนชื่อคุณลักษณะ XML และวิธีการเรียนดังนั้นไม่ปลอดภัย 100% ว่าพวกเขาจะไม่ได้มีข้อบกพร่องในวันเดียว

ดังนั้นหากคุณไม่ต้องการมีปัญหาและไม่เคยคิดถึงมันจะดีกว่าถ้าใช้setOnClickListenerหรือไลบรารี่อย่าง ButterKnife ที่มีคำอธิบายประกอบ@OnClick(R.id.button)


onClickแอตทริบิวต์ XML ยังกำหนดclickable = trueเพราะมันเรียกร้องsetOnClickListenerในViewภายใน
Florian วอลเธอร์

1

สมมติว่าคุณต้องการเพิ่มกิจกรรมการคลิกเช่นนี้ main.xml

<Button
    android:id="@+id/btn_register"
    android:layout_margin="1dp"
    android:layout_marginLeft="3dp"
    android:layout_marginTop="10dp"
    android:layout_weight="2"
    android:onClick="register"
    android:text="Register"
    android:textColor="#000000"/>

ในไฟล์ java คุณต้องเขียนวิธีเช่นนี้

public void register(View view) {
}

0

ฉันเขียนรหัสนี้ในไฟล์ xml ...

<Button
    android:id="@+id/btn_register"
    android:layout_margin="1dp"
    android:layout_marginLeft="3dp"
    android:layout_marginTop="10dp"
    android:layout_weight="2"
    android:onClick="register"
    android:text="Register"
    android:textColor="#000000"/>

และเขียนรหัสนี้เป็นส่วน ...

public void register(View view) {
}

นี่เป็นไปได้ในส่วน
user2786249

0

วิธีที่ดีที่สุดในการทำเช่นนี้คือด้วยรหัสต่อไปนี้:

 Button button = (Button)findViewById(R.id.btn_register);
 button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //do your fancy method
            }
        });

ฉันไม่เห็นว่าสิ่งนี้ตอบคำถามได้อย่างไรผู้ถามต้องการหลีกเลี่ยงการสร้างคลาสที่ไม่ระบุชื่อและใช้วิธีการเรียนแทน
ajshort

0

เพื่อทำให้ชีวิตของคุณง่ายขึ้นและหลีกเลี่ยงคลาสที่ไม่ระบุชื่อใน setOnClicklistener () ให้ใช้อินเตอร์เฟส ViewOnClicklistener ดังต่อไปนี้:

ชั้นเรียนสาธารณะ YourClass ขยายการดำเนินงาน CommonActivity ViewOnClickListener, ...

หลีกเลี่ยงนี้:

btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        yourMethod(v);
    }
});

และไปที่:

@Override
public void onClick(View v) {
  switch (v.getId()) {
    case R.id.your_view:
      yourMethod();
      break;
  }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.