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




android onclicklistener (7)

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

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

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

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

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

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

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

प्रश्न 1:

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

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

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

प्रश्न 2:

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

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

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


चीजों को आसान बनाने के लिए प्रश्न 2 कहा गया है, आप वैरिएबल मेमोरी को बचाने के लिए लैम्बडा विधि का उपयोग कर सकते हैं और अपने व्यू क्लास में ऊपर और नीचे नेविगेट करने से बच सकते हैं

//method 1
findViewById(R.id.buttonSend).setOnClickListener(v -> {
          // handle click
});

लेकिन यदि आप एक विधि में एक बार में अपने बटन पर क्लिक ईवेंट लागू करना चाहते हैं
आप @ डी द्वारा प्रश्न 3 का उपयोग कर सकते हैं। ट्रैन जवाब। लेकिन View.OnClickListener साथ अपनी व्यू क्लास को कार्यान्वित करना न भूलें
दूसरे में प्रश्न # 3 का सही उपयोग करने के लिए


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

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

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

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


मेरा नमूना, एंड्रॉइड स्टूडियो 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 अधिक कठिन हैं।


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

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()}"
/>

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

    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 लेआउट में एकाधिक बटनों को असाइन कर सकते हैं, आप एक बटन के लिए एक विधि भी बना सकते हैं, लेकिन इस मामले में मैं गतिविधि वर्ग के अंदर हैंडलर घोषित करना पसंद करते हैं।


चरण 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





android-button