java - एंड्रॉइड:बटन क्लिक को कैसे संभालें



android onclicklistener android-button (9)

विभिन्न पुस्तकालयों के रूप में भी विकल्प उपलब्ध हैं जो इस प्रक्रिया को उन लोगों के लिए बहुत परिचित कर सकते हैं जिन्होंने अन्य एमवीवीएम ढांचे का उपयोग किया है।

https://developer.android.com/topic/libraries/data-binding/

एक आधिकारिक पुस्तकालय का एक उदाहरण दिखाता है, जो आपको इस तरह के बटन बाध्य करने की अनुमति देता है:

<Button
    android:text="Start second activity"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:onClick="@{() -> presenter.showList()}"
/>

गैर-जावा और गैर-एंड्रॉइड क्षेत्र में ठोस अनुभव होने के कारण, मैं एंड्रॉइड सीख रहा हूं।

मुझे विभिन्न क्षेत्रों के साथ बहुत भ्रम है, उनमें से एक बटन क्लिक को संभालने का तरीका है। ऐसा करने के कम से कम 4 तरीके हैं (!!!), वे संक्षेप में here सूचीबद्ध here

स्थिरता उद्देश्य के लिए मैं उन्हें सूचीबद्ध करूंगा:

  1. गतिविधि में View.OnClickListener क्लास का सदस्य है और उसे एक उदाहरण के लिए असाइन करें जो View.OnClickListener गतिविधि विधि पर क्लिक तर्क पर संभाल करेगा।

  2. 'OnCreate' गतिविधि विधि में 'onClickListener' बनाएं और setOnClickListener का उपयोग करके इसे बटन पर असाइन करें

  3. गतिविधि पर 'onClickListener' को कार्यान्वित करें और बटन के लिए श्रोता के रूप में 'यह' असाइन करें। यदि मामले में कुछ बटन हैं, तो बटन आईडी को उचित बटन के लिए 'ऑनक्लिक' हैंडलर निष्पादित करने के लिए विश्लेषण किया जाना चाहिए

  4. उस गतिविधि पर सार्वजनिक विधि है जो 'ऑनक्लिक' तर्क लागू करती है और गतिविधि xml घोषणा में बटन को असाइन करती है

प्रश्न 1:

क्या वे सभी विधियां हैं, क्या कोई अन्य विकल्प है? (मुझे किसी अन्य की आवश्यकता नहीं है, सिर्फ उत्सुक है)

मेरे लिए, सबसे सहज तरीका नवीनतम होगा: इसे कम से कम कोड टाइप करने की आवश्यकता होती है और सबसे अधिक पढ़ने योग्य (कम से कम मेरे लिए) है।

हालांकि, मुझे इस दृष्टिकोण को व्यापक रूप से उपयोग नहीं किया जाता है। इसका उपयोग करने के लिए विपक्ष क्या हैं?

प्रश्न 2:

इन तरीकों में से प्रत्येक के लिए पेशेवर / विपक्ष क्या हैं? कृपया अपना अनुभव या एक अच्छा लिंक साझा करें।

कोई प्रतिक्रिया स्वागत है!

पीएस मैंने Google की कोशिश की है और इस विषय के लिए कुछ खोजा है, लेकिन केवल एक चीज जो मैंने पाया है वह वर्णन है कि "कैसे करें", यह अच्छा या बुरा क्यों नहीं है।


प्रश्न 1: दुर्भाग्यवश, जिसमें आप कहते हैं वह सबसे सहज है एंड्रॉइड में कम से कम उपयोग किया जाता है। जैसा कि मैं समझता हूं, आपको अपना यूआई (एक्सएमएल) और कम्प्यूटेशनल कार्यक्षमता (जावा क्लास फाइल) अलग करना चाहिए। यह आसान डीबगिंग के लिए भी बनाता है। वास्तव में इस तरह से पढ़ने और एंड्रॉइड आईएमओ के बारे में सोचना बहुत आसान है।

प्रश्न 2: मेरा मानना ​​है कि मुख्य रूप से उपयोग किए जाने वाले दो # 2 और # 3 हैं। मैं एक उदाहरण के रूप में एक बटन क्लिक बटन का उपयोग करेंगे।

2

एक अज्ञात वर्ग के रूप में है।

Button clickButton = (Button) findViewById(R.id.clickButton);
clickButton.setOnClickListener( new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                ***Do what you want with the click here***
            }
        });

यह मेरा पसंदीदा है क्योंकि इसमें बटन वैरिएबल को findViewById के साथ सेट किया गया था, इसके ठीक आगे ऑनक्लिक विधि है। यह बहुत साफ और साफ दिखता है कि इस क्लिक से संबंधित सब कुछ बटन बटन व्यू यहां स्थित है।

एक कॉन कि मेरे सहकर्मी टिप्पणी करते हैं, यह कल्पना है कि आपके पास कई विचार हैं जिन्हें श्रोता श्रोता की आवश्यकता है। आप देख सकते हैं कि आपका ऑनक्रेट लंबाई में बहुत लंबा हो जाएगा। तो वह क्यों उपयोग करना पसंद करता है:

3

मान लें कि आपके पास है, 5 क्लिकबटन:

सुनिश्चित करें कि आपकी गतिविधि / टुकड़ा OnClickListener लागू करें

// in OnCreate

Button mClickButton1 = (Button)findViewById(R.id.clickButton1);
mClickButton1.setOnClickListener(this);
Button mClickButton2 = (Button)findViewById(R.id.clickButton2);
mClickButton2.setOnClickListener(this);
Button mClickButton3 = (Button)findViewById(R.id.clickButton3);
mClickButton3.setOnClickListener(this);
Button mClickButton4 = (Button)findViewById(R.id.clickButton4);
mClickButton4.setOnClickListener(this);
Button mClickButton5 = (Button)findViewById(R.id.clickButton5);
mClickButton5.setOnClickListener(this);


// somewhere else in your code

public void onClick(View v) {
    switch (v.getId()) {
        case  R.id.clickButton1: {
            // do something for button 1 click
            break;
        }

        case R.id.clickButton2: {
            // do something for button 2 click
            break;
        }

        //.... etc
    }
}

इस तरह से मेरा सहकर्मी बताता है कि उसकी आंखों में नीरस है, क्योंकि सभी ऑनक्लिक गणना एक ही स्थान पर संभाली जाती है और ऑनरेट विधि को भीड़ नहीं देती है। लेकिन मुझे लगता है कि नकारात्मक पक्ष यह है कि:

  1. खुद को देखता है,
  2. और ऑनक्लिक विधि द्वारा उपयोग किए जाने वाले किसी अन्य ऑब्जेक्ट पर स्थित हो सकता है जिसे किसी फ़ील्ड में बनाना होगा।

अगर आप अधिक जानकारी चाहते हैं तो मुझे बताएं। मैंने आपके प्रश्न का पूरी तरह उत्तर नहीं दिया क्योंकि यह एक बहुत लंबा सवाल है। और अगर मुझे कुछ साइटें मिलती हैं तो मैं अपना जवाब बढ़ा दूंगा, अभी मैं कुछ अनुभव दे रहा हूं।


प्रश्न # 1 - दृश्य क्लिक को संभालने का यही एकमात्र तरीका है।

प्रश्न 2 -
विकल्प # 1 / विकल्प # 4 - विकल्प # 1 और विकल्प # 4 के बीच बहुत अंतर नहीं है। एकमात्र अंतर जो मैं देखता हूं वह एक मामले गतिविधि ऑनक्लिक लिस्टनर को कार्यान्वित कर रहा है, जबकि, दूसरे मामले में, एक अनाम कार्यान्वयन होगा।

विकल्प # 2 - इस विधि में एक अनाम कक्षा उत्पन्न की जाएगी। यह विधि थोड़ी कमजोर है, क्योंकि यदि आपके पास एकाधिक बटन हैं, तो आपको इसे कई बार करना होगा। बेनामी कक्षाओं के लिए, आपको मेमोरी लीक को संभालने के लिए सावधान रहना होगा।

विकल्प # 3 - हालांकि, यह एक आसान तरीका है। आम तौर पर, प्रोग्रामर जब तक इसे लिखते हैं, तब तक किसी भी विधि का उपयोग न करने का प्रयास करते हैं, और इसलिए इस विधि का व्यापक रूप से उपयोग नहीं किया जाता है। आप देखेंगे कि ज्यादातर लोग विकल्प # 4 का उपयोग करते हैं। क्योंकि यह कोड की अवधि में क्लीनर है।


# 1 मैं लेआउट पर बटन होने पर अक्सर अंतिम बार उपयोग करता हूं (लेकिन स्पष्ट रूप से स्थैतिक)।

यदि आप अभ्यास में और व्यावसायिक अनुप्रयोग में इसका उपयोग करते हैं, तो यहां अतिरिक्त ध्यान दें, क्योंकि जब आप प्रोगार्ड जैसे स्रोत ओबफसकेटर का उपयोग करते हैं, तो आपको इन तरीकों को अपनी गतिविधि में चिह्नित करने की आवश्यकता होगी क्योंकि इसे अचूक नहीं किया जाना चाहिए।

इस दृष्टिकोण के साथ कुछ प्रकार की संकलन-समय-सुरक्षा संग्रहित करने के लिए, एंड्रॉइड लिंट ( example ) पर एक नज़र डालें।

# 2 सभी विधियों के लिए पेशेवर और विपक्ष लगभग समान हैं और सबक होना चाहिए:

जो भी सबसे उपयुक्त है उसका उपयोग करें या आपके लिए सबसे सहज महसूस करें।

यदि आपको एक ही OnClickListener को एकाधिक बटन उदाहरणों में असाइन करना है, तो उसे कक्षा-स्कोप (# 1) में सहेजें। यदि आपको बटन के लिए एक साधारण श्रोता की आवश्यकता है, तो अनाम कार्यान्वयन करें:

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        // Take action.
    }
});

मैं गतिविधि में OnClickListener को लागू नहीं करता OnClickListener , यह समय-समय पर थोड़ा उलझन में OnClickListener है (विशेष रूप से जब आप कई अन्य ईवेंट-हैंडलर लागू करते हैं और कोई नहीं जानता कि this सब क्या कर रहा है)।


चरण 1: एक एक्सएमएल फ़ाइल बनाना

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/btnClickEvent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Click Me" />
</LinearLayout>

चरण 2: मुख्य गतिविधि बनाएं

package com.scancode.acutesoft.telephonymanagerapp;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity implements View.OnClickListener {

    Button btnClickEvent;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnClickEvent = (Button) findViewById(R.id.btnClickEvent);
        btnClickEvent.setOnClickListener(MainActivity.this);

    }

    @Override
    public void onClick(View v) {
        //Your Logic
    }
}

HappyCoding


सबसे अधिक इस्तेमाल किया जाने वाला तरीका, अज्ञात घोषणा है

    Button send = (Button) findViewById(R.id.buttonSend);
    send.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // handle click
        }
    });

इसके अलावा आप View.OnClickListener ऑब्जेक्ट बना सकते हैं और इसे बाद में बटन पर सेट कर सकते हैं, लेकिन आपको अभी भी ऑनक्लिक विधि को ओवरराइड करने की आवश्यकता है उदाहरण के लिए

View.OnClickListener listener = new View.OnClickListener(){
     @Override
        public void onClick(View v) {
            // handle click
        }
}   
Button send = (Button) findViewById(R.id.buttonSend);
send.setOnClickListener(listener);

जब आपकी गतिविधि ऑनक्लिक लिस्टनर इंटरफ़ेस लागू करती है तो आपको गतिविधि स्तर पर ऑनक्लिक (देखें v) विधि ओवरराइड करना होगा। फिर आप इस गतिविधि को बटन पर श्रोता के रूप में देख सकते हैं, क्योंकि यह पहले से ही इंटरफ़ेस लागू करता है और ऑनक्लिक () विधि को ओवरराइड करता है

public class MyActivity extends Activity implements View.OnClickListener{


    @Override
    public void onClick(View v) {
        // handle click
    }


    @Override
    public void onCreate(Bundle b) {
        Button send = (Button) findViewById(R.id.buttonSend);
        send.setOnClickListener(this);
    }

}

(imho) 4-वें दृष्टिकोण का उपयोग किया जाता है जब एकाधिक बटनों में एक ही हैंडलर होता है, और आप गतिविधि वर्ग में एक विधि घोषित कर सकते हैं और इस विधि को xml लेआउट में एकाधिक बटनों को असाइन कर सकते हैं, आप एक बटन के लिए एक विधि भी बना सकते हैं, लेकिन इस मामले में मैं गतिविधि वर्ग के अंदर हैंडलर घोषित करना पसंद करते हैं।


मेरा नमूना, एंड्रॉइड स्टूडियो 2.1 में परीक्षण किया गया

एक्सएमएल लेआउट में बटन परिभाषित करें

<Button
    android:id="@+id/btn1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

जावा पल्सेशन का पता लगाने

Button clickButton = (Button) findViewById(R.id.btn1);
if (clickButton != null) {
    clickButton.setOnClickListener( new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            /***Do what you want with the click here***/
        }
    });
}

मैं विकल्प 4 पसंद करता हूं, लेकिन यह मुझे सहज ज्ञान देता है क्योंकि मैं Grails, Groovy, और JavaFX में बहुत अधिक काम करता हूं। दृश्य और नियंत्रक के बीच "जादू" कनेक्शन सभी में आम हैं। विधि को अच्छी तरह से नाम देना महत्वपूर्ण है:

दृश्य में, बटन या अन्य विजेट पर ऑनक्लिक विधि जोड़ें:

    android:clickable="true"
    android:onClick="onButtonClickCancel"

फिर कक्षा में, विधि को संभालें:

public void onButtonClickCancel(View view) {
    Toast.makeText(this, "Cancel pressed", Toast.LENGTH_LONG).show();
}

दोबारा, विधि को स्पष्ट रूप से नाम दें, आपको वैसे भी कुछ करना चाहिए, और रखरखाव दूसरी प्रकृति बन जाता है।

एक बड़ा फायदा यह है कि आप विधि के लिए यूनिट परीक्षण अब लिख सकते हैं। विकल्प 1 ऐसा कर सकता है, लेकिन 2 और 3 अधिक कठिन हैं।


ये बिल्कुल वही हैं। android:onClick को एपीआई स्तर 4 में जोड़ा गया ताकि इसे आसान, अधिक जावास्क्रिप्ट-वेब-जैसी, और एक्सएमएल से सबकुछ ड्राइव किया जा सके। यह आंतरिक रूप से क्या करता है बटन पर OnClickListener , जो आपकी DoIt विधि को कॉल करता है।

android:onClick="DoIt" का उपयोग करने का यहां बताया गया है android:onClick="DoIt" आंतरिक रूप से करता है:

Button button= (Button) findViewById(R.id.buttonId);
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        DoIt(v);
    }
});

android:onClick का उपयोग करके आप एकमात्र चीज का व्यापार करते हैं android:onClick , एक्सएमएल कॉन्फ़िगरेशन के साथ सामान्य रूप से, यह है कि गतिशील सामग्री को जोड़ने में थोड़ा मुश्किल हो जाता है (प्रोग्रामेटिक रूप से, आप अपने चर के आधार पर एक श्रोता या अन्य जोड़ने का निर्णय ले सकते हैं)। लेकिन यह DoIt विधि के भीतर अपना परीक्षण जोड़कर आसानी से पराजित हो जाता है।





java android onclicklistener android-button