অ্যান্ড্রয়েড: কীভাবে বোতাম ক্লিক করতে হবে


97

জাভা-অ এবং অ-অ্যান্ড্রয়েড অঞ্চলে একটি দৃ experience় অভিজ্ঞতা অর্জন করে, আমি অ্যান্ড্রয়েড শিখছি।

আমার বিভিন্ন অঞ্চল নিয়ে প্রচুর বিভ্রান্তি রয়েছে, এর মধ্যে একটি হ'ল কীভাবে বোতাম ক্লিকগুলি পরিচালনা করতে হয়। এটি করার কমপক্ষে 4 টি উপায় রয়েছে (!!!), সেগুলি এখানে সংক্ষেপে তালিকাভুক্ত করা হয়েছে

ধারাবাহিকতার উদ্দেশ্যে আমি তাদের তালিকা করে দেব:

  1. View.OnClickListenerক্রিয়াকলাপে শ্রেণীর কোনও সদস্য থাকুন এবং এটিকে এমন একটি ঘটনার দায়িত্ব অর্পণ করুন onClickযা onCreateক্রিয়াকলাপ পদ্ধতিতে যুক্তি পরিচালনা করবে ।

  2. 'অনক্রিট' ক্রিয়াকলাপ পদ্ধতিতে 'অনক্লিকলিস্টনার' তৈরি করুন এবং সেটঅনক্লিকলিস্টনার ব্যবহার করে এটি বোতামে বরাদ্দ করুন

  3. ক্রিয়াকলাপেই 'অনক্লিকলিস্টনার' প্রয়োগ করুন এবং বোতামটির শ্রোতা হিসাবে 'এটি' বরাদ্দ করুন। কেসটির জন্য যদি ক্রিয়াকলাপে কয়েকটি বোতাম থাকে, তবে সঠিক বোতামটির জন্য 'অনক্লিক' হ্যান্ডলারটি কার্যকর করতে বোতাম আইডি বিশ্লেষণ করা উচিত

  4. ক্রিয়াকলাপে সর্বজনীন পদ্ধতি রয়েছে যা 'অনক্লিক' যুক্তি প্রয়োগ করে এবং ক্রিয়াকলাপের এক্সএমএল ঘোষণার বোতামে এটি বরাদ্দ করে

প্রশ্ন 1:

এই সমস্ত পদ্ধতি আছে, অন্য কোন বিকল্প আছে? (আমার আর কোনও দরকার নেই, কৌতূহলী)

আমার জন্য, সবচেয়ে স্বজ্ঞাত উপায়টি সর্বশেষতম পদ্ধতি হবে: এটি টাইপ করার জন্য ন্যূনতম পরিমাণের কোড প্রয়োজন এবং সর্বাধিক পাঠযোগ্য (কমপক্ষে আমার জন্য)।

যদিও, আমি এই পদ্ধতির ব্যাপকভাবে ব্যবহৃত দেখতে পাচ্ছি না। এটি ব্যবহারের জন্য কনস কী?

প্রশ্ন # 2:

এই প্রতিটি পদ্ধতির জন্য কি কি উপকার / কনস আছে? আপনার অভিজ্ঞতা বা একটি ভাল লিঙ্ক হয় শেয়ার করুন।

যে কোনও প্রতিক্রিয়া স্বাগত!

পিএস আমি গুগলে চেষ্টা করেছি এবং এই বিষয়টির জন্য কিছু খুঁজে পেয়েছি, তবে কেবলমাত্র আমি খুঁজে পেয়েছি তা হ'ল "কীভাবে" তা করা উচিত, কেন এটি ভাল বা খারাপ নয়।

উত্তর:


149

প্রশ্ন 1: দুর্ভাগ্যক্রমে আপনি যেটিকে সবচেয়ে স্বজ্ঞাত বলেছিলেন সেটি অ্যান্ড্রয়েডের মধ্যে সবচেয়ে কম ব্যবহৃত হয়। আমি যেমন বুঝতে পেরেছি, আপনার আপনার ইউআই (এক্সএমএল) এবং গণনা কার্যকারিতা (জাভা ক্লাস ফাইলগুলি) আলাদা করা উচিত। এটি সহজে ডিবাগিংয়ের জন্যও করে। এইভাবে পড়া এবং অ্যান্ড্রয়েড ইমো সম্পর্কে চিন্তা করা আসলে অনেক সহজ।

প্রশ্ন 2: আমি বিশ্বাস করি মূলত ব্যবহৃত দুটি হ'ল # 2 এবং # 3। আমি উদাহরণ হিসাবে একটি বাটন ক্লিক বাটন ব্যবহার করব।

একটি বেনাম শ্রেণীর আকারে।

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

এটি আমার প্রিয় কারণ এটিতে ক্লিক ক্লিকের ঠিক পাশেই যেখানে উইন্ডোজবিআইআইডি দিয়ে বোতাম ভেরিয়েবল সেট করা হয়েছিল। এটি খুব ঝরঝরে এবং পরিপাটি বলে মনে হচ্ছে যে এই ক্লিক বাটন বাটন ভিউয়ের সাথে সম্পর্কিত সমস্ত কিছুই এখানে অবস্থিত।

আমার সহকর্মী মন্তব্য করেছেন যে একটি কন, আপনার কল্পনা শ্রোতা প্রয়োজন যে অনেক মতামত কল্পনা। আপনি দেখতে পাচ্ছেন যে আপনার অনক্রিট দীর্ঘ দৈর্ঘ্যে পাবে। যাতে সে ব্যবহার করতে পছন্দ করে:

বলুন আপনার কাছে রয়েছে 5 টি ক্লিকবটন:

আপনার কার্যকলাপ / খণ্ডটি অনক্লিকলিস্টনার প্রয়োগ করে তা নিশ্চিত করুন

// 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. এবং অনক্লিক পদ্ধতিতে ব্যবহার করা অনক্রিটটিতে থাকা অন্য যে কোনও অবজেক্টকে ক্ষেত্র তৈরি করতে হবে।

আপনি আরও তথ্য চান তা আমাকে জানাবেন। আমি আপনার প্রশ্নের পুরোপুরি উত্তর দিলাম না কারণ এটি একটি দীর্ঘ প্রশ্ন। এবং যদি আমি কিছু সাইট পাই তবে আমি আমার উত্তরটি প্রসারিত করব, এখনই আমি কিছু অভিজ্ঞতা দিচ্ছি।


4
বিকল্প 2 এর জন্য আপনি এটি তৈরি করতে চাইবেন: ক্লিক করুন বাটন.সেটঅনক্লিকলিস্টার (নতুন দেখুন.অনক্লিকলিস্টার () {@ ওভাররাইড পাবলিক শূন্য অনক্লিক (ভি ভি) {// টডো আপনি কী করতে চান;}); এটি অনিক্লিকলিস্টেনার সমাধানে সহায়তা করতে
কলসালক্রিস

বিকল্প 3 সম্ভবত সবচেয়ে পরিষ্কার এবং এমভিপি প্যাটার্ন সহ প্রসারিত সবচেয়ে সহজ।
রাফায়েউ

বিকল্প 2 এখনও এমন উত্পাদন করতে পারে onCreate()যা অত্যন্ত দীর্ঘস্থায়ী নয়। ক্লিক শ্রোতার অ্যাসাইনমেন্ট এবং বেনামে ক্লাসগুলি থেকে পৃথক সহায়ক সাহায্যকারী পদ্ধতিতে সন্ধান করা যেতে পারে onCreate()
নিক আলেক্সেভ

@ কলসাল: আপনার এটি করার দরকার নেই। ক্রিয়াকলাপ শ্রেণিতে এক্সটেনশন যুক্ত করুন যেমন "প্রয়োগগুলি দেখুন Oঅনলিক্লিকলিস্টেনার"।
TomeeNS

11

# 1 আমি শেষটি প্রায়শই ব্যবহার করি যখন উত্পন্ন হয় না এমন লেআউটে বোতামগুলি থাকে (তবে স্পষ্টতই স্থির থাকে)।

আপনি যদি এটি ব্যবহার করে এবং ব্যবসায়িক প্রয়োগে ব্যবহার করেন তবে এখানে অতিরিক্ত মনোযোগ দিন, কারণ আপনি যখন প্রোগুয়ার্ডের মতো সোর্স ওবফাসকটার ব্যবহার করেন, তখন আপনার কার্যকলাপে এই পদ্ধতিগুলি চিহ্নিত করতে হবে যাতে অবসন্ন না হয়।

এই পদ্ধতির সাথে এক ধরণের সংকলন-সময়-সুরক্ষা সংরক্ষণাগারটির জন্য, অ্যান্ড্রয়েড লিন্টের উদাহরণ দেখুন ( উদাহরণস্বরূপ )।


# 2 সমস্ত পদ্ধতির প্রো এবং কনস প্রায় একই রকম এবং পাঠটি হওয়া উচিত:

যা কখনও সবচেয়ে উপযুক্ত বা আপনার কাছে সবচেয়ে স্বজ্ঞাত বোধ করে তা ব্যবহার করুন।

যদি আপনাকে OnClickListenerএকাধিক বোতামের দৃষ্টান্তগুলিতে একই বরাদ্দ করতে হয় , তবে এটি শ্রেণিবদ্ধে সংরক্ষণ করুন (# 1)। যদি আপনার কোনও বোতামের জন্য সাধারণ শ্রোতার দরকার হয়, একটি বেনামে বাস্তবায়ন করুন:

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

আমি OnClickListenerক্রিয়াকলাপটি বাস্তবায়ন না করার ঝোঁক করি , এটি সময়ে সময়ে কিছুটা বিভ্রান্তি লাভ করে (বিশেষত যখন আপনি একাধিক অন্যান্য ইভেন্ট হ্যান্ডলারগুলি প্রয়োগ করেন এবং কেউ কী জানেন না যে thisকী করছে)।


আমি একই অনুসরণ করছি তবে এখনও ফাংশনটির জন্য কোনও আউটপুট পাচ্ছি না, আমার কোড এবং কোয়েরিটি এখানে রয়েছে: stackoverflow.com/questions/25107427/…
রকেট

8

আমি বিকল্প 4 পছন্দ করি, তবে এটি আমার কাছে স্বজ্ঞাত ধারণা দেয় কারণ আমি গ্রিলস, গ্রোভি এবং জাভাএফএক্সে অনেক বেশি কাজ করি। দর্শন এবং নিয়ামকের মধ্যে "ম্যাজিক" সংযোগগুলি সমস্ত ক্ষেত্রেই সাধারণ। পদ্ধতির নামটি রাখা ভাল:

ভিউতে, বোতামে বা অন্যান্য উইজেটের অনক্লিক পদ্ধতিটি যুক্ত করুন:

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

ক্লাসে, পদ্ধতিটি পরিচালনা করুন:

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

আবার, পদ্ধতিটি পরিষ্কারভাবে নাম দিন, যাইহোক আপনার কিছু করা উচিত এবং রক্ষণাবেক্ষণটি দ্বিতীয়-প্রকৃতিতে পরিণত হয়।

একটি বড় সুবিধা হ'ল পদ্ধতিটির জন্য আপনি এখন ইউনিট পরীক্ষা লিখতে পারেন। বিকল্প 1 এটি করতে পারে তবে 2 এবং 3 আরও বেশি কঠিন।


4
আমি কিছুটা দফায় দফায় পঞ্চম বিকল্পটি প্রস্তাব করছি (না, ব্রুস উইলিস অভিনীত নয় :)), বিকল্পগুলির একটি বৈকল্পিক 2: ক্লিকগুলি পরিচালনা করতে মডেল-ভিউ-উপস্থাপক কাঠামোর একটি উপস্থাপক শ্রেণি ব্যবহার করুন। এটি স্বয়ংক্রিয় পরীক্ষার অনেক সহজ করে তোলে। আরও তথ্যের জন্য এই লিঙ্কটি দেখুন: কোডলাবস.ডিভেলফার্স.কম
স্টিভ গেলম্যান

4

সর্বাধিক ব্যবহৃত উপায় হ'ল, বেনামে ঘোষণা

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

যখন আপনার ক্রিয়াকলাপটি অনক্লিকলিস্টনার ইন্টারফেস প্রয়োগ করে আপনাকে অবশ্যই ক্রিয়াকলাপ স্তরে অনক্লিক (ভি ভি) পদ্ধতি ওভাররাইড করতে হবে। তারপরে আপনি এই ক্রিয়াকলাপটিকে শ্রোতার বোতাম হিসাবে আশ্বস্ত করতে পারেন, কারণ এটি ইতিমধ্যে ইন্টারফেস প্রয়োগ করে এবং অনক্লিক () পদ্ধতিটি ওভাররাইড করে

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-তম পদ্ধতিটি ব্যবহৃত হয় যখন একাধিক বোতামের একই হ্যান্ডলার থাকে এবং আপনি ক্রিয়াকলাপ শ্রেণিতে একটি পদ্ধতি ঘোষণা করতে পারেন এবং এক্সএমএল লেআউটে একাধিক বোতামে এই পদ্ধতিটি নির্ধারণ করতে পারেন, তবে আপনি একটি বোতামের জন্য একটি পদ্ধতি তৈরি করতে পারেন, তবে এই ক্ষেত্রে আমি ক্রিয়াকলাপ শ্রেণীর অভ্যন্তরে হ্যান্ডলারগুলি ঘোষণা করতে পছন্দ করুন।


1

বিকল্প 1 এবং 2 এর মধ্যে অভ্যন্তর শ্রেণি ব্যবহার করা জড়িত যা কোড ধরণের বিশৃঙ্খলা তৈরি করে। অপশন 2 হ'ল ধরণের অগোছালো কারণ প্রতি বোতামের জন্য একজন শ্রোতা থাকবেন। আপনার যদি সংখ্যক বোতাম থাকে তবে এটি ঠিক আছে। বিকল্প 4 এর জন্য আমি মনে করি এটি ডিবাগ করা আরও শক্ত হবে কারণ আপনাকে ফিরে যেতে হবে এবং এক্সএমএল এবং জাভা কোডটি চতুর্থ করতে হবে। যখন আমাকে একাধিক বোতাম ক্লিকগুলি পরিচালনা করতে হয় আমি ব্যক্তিগতভাবে 3 বিকল্পটি ব্যবহার করি।


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***/
        }
    });
}

1

প্রশ্ন 2 তে বলা বিষয়গুলিকে আরও সহজ করে তুলতে, আপনি ভেরিয়েবল মেমরিটি সংরক্ষণ করতে এবং আপনার ভিউ ক্লাসে উপরে এবং নীচে নেভিগেট এড়াতে এ জাতীয় ল্যাম্বদা পদ্ধতি ব্যবহার করতে পারেন

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

তবে আপনি যদি কোনও পদ্ধতিতে একবারে আপনার বোতামে ক্লিক ইভেন্ট প্রয়োগ করতে চান।

আপনি @ ডি দ্বারা প্রশ্ন 3 ব্যবহার করতে পারেন। ট্রান উত্তর। তবে আপনার ভিউ ক্লাসটি প্রয়োগ করতে ভুলবেন না View.OnClickListener

অন্যান্য ক্ষেত্রে প্রশ্ন # 3 সঠিকভাবে ব্যবহার করুন


4
এটি পদ্ধতির রেফারেন্স আইএমওর সাথে মিলিত আধুনিক উত্তর হিসাবে বিবেচনা করা উচিত। অন্যান্য উত্তরগুলির বেশিরভাগই এন্ড্রয়েডে পুরানো পূর্ব জাভ 8 কোডের সত্যটি ডাকে না।
রায়ান দ্য লিচ

0

প্রশ্ন # 1 - এই দেখার জন্য ক্লিকগুলি হ্যান্ডেল করার একমাত্র উপায়।

প্রশ্ন # 2 -
বিকল্প # 1 / বিকল্প # 4 - বিকল্প # 1 এবং বিকল্প # 4 এর মধ্যে খুব বেশি পার্থক্য নেই। কেবলমাত্র তফাতটি আমি দেখতে পাই একটি ক্ষেত্রে ক্রিয়াকলাপটি অনক্লিকলিস্টনার বাস্তবায়ন করছে, অন্যদিকে, বেনামে বাস্তবায়ন হবে।

বিকল্প # 2 - এই পদ্ধতিতে একটি বেনাম শ্রেণি তৈরি করা হবে। এই পদ্ধতিটি খানিকটা দুর্দশাগ্রস্ত, যেমন আপনার একাধিক বোতাম থাকলে আপনার এটি একাধিকবার করা দরকার। বেনামি ক্লাসগুলির জন্য, আপনাকে মেমরি ফাঁস পরিচালনা করার জন্য যত্নবান হতে হবে।

বিকল্প # 3 - যদিও এটি একটি সহজ উপায়। সাধারণত, প্রোগ্রামাররা কোনও পদ্ধতি না লিখে সেগুলি ব্যবহার না করার চেষ্টা করে এবং তাই এই পদ্ধতিটি ব্যাপকভাবে ব্যবহৃত হয় না। আপনি দেখতে পাবেন বেশিরভাগ লোকেরা বিকল্প # 4 ব্যবহার করেন। কারণ কোডের ক্ষেত্রে এটি ক্লিনার er


হাই গৌরব, উত্তরের জন্য আপনাকে ধন্যবাদ। তবে আপনি দয়া করে এখানে কী বলতে চাইছেন তা স্পষ্ট করে বলতে পারেন: বেনাম শ্রেণীর জন্য, মেমরি ফাঁস পরিচালনা করার জন্য আপনাকে সতর্কতা অবলম্বন করতে হবে। স্মৃতি ফাঁস এখানে কিভাবে আসে?
বুদা

আপনাকে কেবল সচেতন থাকতে হবে: আপনি যদি এমন কোনও পদ্ধতির ভিতরে বেনামী ক্লাস তৈরি করেন যা আপনার অ্যাপ্লিকেশনটির জীবদ্দশায় একাধিকবার কল হতে পারে তবে এক শ্রেণির কয়েকটি উদাহরণ তৈরি করা হবে না তবে সেগুলির উদাহরণ সহ বেশ কয়েকটি ক্লাস তৈরি করা হবে। আপনি এড়াতে পারেন নিয়মিত অভ্যন্তরীণ ক্লাস ব্যবহার করে এবং শ্রোতাদের উদাহরণ ক্ষেত্র হিসাবে ইনস্ট্যান্ট করে। কনস্ট্রাক্টর আর্গুমেন্টের মাধ্যমে শ্রোতার রাষ্ট্রকে সচেতন করে বিভিন্ন শ্রোতার শ্রেণি হ্রাস করার চেষ্টা করুন। একটি নিয়মিত অভ্যন্তর শ্রেণি আপনাকে কাস্টম কনস্ট্রাক্টর এবং অন্যান্য পদ্ধতির সুবিধা দেয়।
রিসাদিনহা

0

বিভিন্ন লাইব্রেরি আকারে অপশনগুলি উপলব্ধ রয়েছে যা অন্যান্য এমভিভিএম ফ্রেমওয়ার্কগুলি ব্যবহার করে এমন লোকদের জন্য এই প্রক্রিয়াটিকে খুব পরিচিত করে তুলতে পারে।

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

0

পদক্ষেপ 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
    }
}

হ্যাপি কোডিং!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.