অ্যান্ড্রয়েডটি ঠিক কীভাবে ব্যবহার করে: অনক্লিক এক্সএমএল বৈশিষ্ট্যটি সেটঅনলিক্লিকলিস্টারের থেকে আলাদা?


416

সেখান থেকে আমি পড়েছি আপনি onClickএকটি বোতামে দুটি উপায়ে কোনও হ্যান্ডলার নিয়োগ করতে পারেন ।

android:onClickXML অ্যাট্রিবিউট ব্যবহার করে যেখানে আপনি কেবল স্বাক্ষর সহ একটি সর্বজনীন পদ্ধতির নাম ব্যবহার করেন void name(View v)বা সেই setOnClickListenerপদ্ধতিটি ব্যবহার করে যেখানে আপনি কোনও বস্তু পাস করেন যা OnClickListenerইন্টারফেস প্রয়োগ করে । পরবর্তীকালে প্রায়শই একটি বেনাম শ্রেণীর প্রয়োজন হয় যা ব্যক্তিগতভাবে আমি পছন্দ করি না (ব্যক্তিগত স্বাদ) বা প্রয়োগ করে এমন অভ্যন্তরীণ শ্রেণীর সংজ্ঞা দেয় OnClickListener

এক্সএমএল অ্যাট্রিবিউট ব্যবহার করে আপনাকে কেবল কোনও ক্লাসের পরিবর্তে কোনও পদ্ধতি নির্ধারণ করতে হবে তাই আমি ভাবছিলাম যে এটি কোডের মাধ্যমেও করা যেতে পারে এবং এক্সএমএল লেআউটে নয়।


4
আমি আপনার সমস্যাটি পড়েছি এবং আমি মনে করি আপনি আমার মতো ঠিক একই জায়গায় আটকে আছেন। আমি একটি খুব ভাল ভিডিও পেয়েছি যা আমার সমস্যা সমাধানে আমাকে খুব সহায়তা করেছে। নিম্নলিখিত লিঙ্কটিতে ভিডিওটি সন্ধান করুন: youtube.com/watch?v=MtmHURWKCmg&feature=youtu.be আশা করি এটি
আপনাকেও

9
যারা উপরের মন্তব্যে পোস্ট করা ভিডিওটি দেখে সময় বাঁচাতে চান তাদের পক্ষে এটি সহজভাবে দেখায় onClickযে লেআউট ফাইলে তার বৈশিষ্ট্যের জন্য দুটি বোতাম কীভাবে একই পদ্ধতিতে থাকতে পারে । এটি পরামিতি ধন্যবাদ View v। আপনি কেবল পরীক্ষা if (v == findViewById(R.id.button1)) ইত্যাদি ..
CodyBugstein

13
@ ইমরে আমি মনে করি এটি ব্যবহার করা ভাল v.getId() == R.id.button1, যেহেতু আপনাকে প্রকৃত নিয়ন্ত্রণ খুঁজে পেতে এবং তুলনা করতে হবে না। এবং আপনি switchপ্রচুর আইএফএসের পরিবর্তে একটি ব্যবহার করতে পারেন ।
সামি কুহমনেন

3
এই টিউটোরিয়ালটি আপনাকে অনেক সাহায্য করবে। এখানে ক্লিক করুন
c49

এক্সএমএল অ্যান্ড্রয়েড ব্যবহার: অনক্লিক একটি ক্র্যাশ ঘটায়।

উত্তর:


604

না, কোডের মাধ্যমে এটি সম্ভব নয়। 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 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 -->

ব্যাকগ্রাউন্ডে, অ্যান্ড্রয়েড জাভা কোড ব্যতীত অন্য কিছু করে না, ক্লিক পদ্ধতিতে আপনার পদ্ধতিটিকে কল করে।

নোট করুন যে উপরের এক্সএমএল সহ অ্যান্ড্রয়েড কেবল বর্তমান ক্রিয়াকলাপে কেবল onClickপদ্ধতিটি সন্ধান করবে myFancyMethod()। আপনি যদি টুকরোগুলি ব্যবহার করে থাকেন তবে এটি মনে রাখা গুরুত্বপূর্ণ, যেহেতু আপনি যদি কোনও টুকরোটি ব্যবহার করে উপরের এক্সএমএল যুক্ত করেন তবে অ্যান্ড্রয়েড এক্সএমএল যুক্ত করতে ব্যবহৃত টুকরাটির ফাইলটিতে onClickপদ্ধতিটি সন্ধান করবে না .java

আরেকটি গুরুত্বপূর্ণ বিষয় আমি লক্ষ্য করেছি। আপনি উল্লেখ করেছেন যে আপনি বেনামে পদ্ধতি পছন্দ করেন না । আপনি বলতে চেয়েছিলেন আপনি বেনামে ক্লাস পছন্দ করেন না ।


4
আমি জাভা গুরু নই তবে হ্যাঁ, আমি বেনাম শ্রেণি বোঝাই। আপনার উত্তর দেওয়ার জন্য ধন্যবাদ. খুব পরিস্কার.
এমিট্রাক্স

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

12
হ্যাঁ, পদ্ধতিটি সর্বজনীন হতে হবে।
অক্টাভিয়ান এ। দামিয়ান

12
মজার বিষয় হ'ল কোডটিতে এটি করার ফলে পদ্ধতিটিকে ব্যক্তিগত করে মেসেজের অ্যাক্সেসের shাল দেওয়া যায়, অন্যদিকে এক্সএমএল পদ্ধতিতে পদ্ধতিটি প্রকাশের দিকে নিয়ে যায়।
bgse

5
ক্রিয়াকলাপটি (এক্সএমএল পদ্ধতির) অবশ্যই কার্যকলাপের মধ্যে থাকা উচিত তা কেবল যখন আপনি খণ্ডগুলি বিবেচনা করেন তা নয়, তবে কাস্টম ভিউগুলি (বোতামটি ধারণ করে )ও গুরুত্বপূর্ণ। আপনি যখন একাধিক ক্রিয়াকলাপে পুনঃব্যবহার করেন এমন কাস্টম দর্শন থাকলে তবে আপনি সমস্ত ক্ষেত্রে একই অনক্লিক পদ্ধতিটি ব্যবহার করতে চান, এক্সএমএল পদ্ধতিটি সবচেয়ে সুবিধাজনক নয়। আপনার কাস্টম ভিউ ব্যবহার করে এমন প্রতিটি ক্রিয়াকলাপে আপনাকে এই ক্লিকমথোড (একই দেহ সহ) লাগাতে হবে।
বারটেক লিপিনস্কি

87

আমি যখন শীর্ষের উত্তরটি দেখেছি তখন তা আমাকে বুঝতে পেরেছিল যে আমার সমস্যা অভিনব পদ্ধতিতে প্যারামিটারটি (ভি ভি) রাখছে না:

public void myFancyMethod(View v) {}

এক্সএমএল থেকে এটি অ্যাক্সেস করার চেষ্টা করার সময়, ব্যবহার করা উচিত

android:onClick="myFancyMethod"/>

আশা করি যে কাউকে সাহায্য করবে।


74

android:onClick এটি এপিআই লেভেল 4 এর পরে, সুতরাং আপনি <1.6 টার্গেট করছেন তবে আপনি এটি ব্যবহার করতে পারবেন না।


33

আপনি পদ্ধতিটি জনসাধারণের কাছে রাখতে ভুলে গেছেন কিনা তা পরীক্ষা করে দেখুন!


1
কেন এটি প্রকাশ করা বাধ্যতামূলক?
eRaisedToX

3
@eRaisedToX আমি মনে করি এটি বেশ স্পষ্ট: এটি প্রকাশ্য না হলে এটিকে অ্যান্ড্রয়েড কাঠামো থেকে বলা যাবে না।
m0skit0

28

উদাহরণস্বরূপ অভ্যন্তরীণভাবে কল করার ক্ষেত্রে android:onClickঅ্যাট্রিবিউট ফলাফলগুলি নির্দিষ্ট করে । সুতরাং একেবারে কোনও পার্থক্য নেই।ButtonsetOnClickListener

পরিষ্কার বোঝার জন্য, আসুন দেখুন কীভাবে এক্সএমএল onClickবৈশিষ্ট্যটি ফ্রেমওয়ার্ক দ্বারা পরিচালনা করা হয়।

যখন কোনও বিন্যাসের ফাইলটি স্ফীত হয়, এতে উল্লিখিত সমস্ত দর্শন তাত্ক্ষণিকভাবে শুরু করা হয়। এই নির্দিষ্ট ক্ষেত্রে, Buttonউদাহরণটি public Button (Context context, AttributeSet attrs, int defStyle)কনস্ট্রাক্টর ব্যবহার করে তৈরি করা হয় । এক্সএমএল ট্যাগের সমস্ত বৈশিষ্ট্য রিসোর্স বান্ডেল থেকে পড়ে এবং AttributeSetকনস্ট্রাক্টর হিসাবে পাস করা হয়।

Buttonক্লাসটি ক্লাস থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয় Viewযার ফলশ্রুতিতে Viewকনস্ট্রাক্টর ডেকে আনা হয়, যা ক্লিক কল ব্যাক হ্যান্ডলারের মাধ্যমে সেট করার যত্ন নেয় setOnClickListener

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ব্যতিক্রম পরিচালনা করতে প্রস্তুত ।
  • অবিচ্ছিন্ন বাটন ক্লিক করে ফ্রেগমেন্টে, কলব্যাকটি ক্রিয়াকলাপে সংজ্ঞায়িত করা উচিত : getContext().getClass().getMethod()কলটি বর্তমান অনুসন্ধানে পদ্ধতি অনুসন্ধান সীমাবদ্ধ করে, যা খণ্ডের ক্ষেত্রে ক্রিয়াকলাপ। অতএব পদ্ধতিটি ক্রিয়াকলাপ শ্রেণীর মধ্যে অনুসন্ধান করা হয় না খণ্ড শ্রেণীর মধ্যে।
  • কলব্যাক পদ্ধতিটি প্যারামিটারটি গ্রহণ করা উচিত : যেহেতু প্যারামিটার হিসাবে Java Class getMethodগ্রহণযোগ্য পদ্ধতির সন্ধান করে View.class

1
এটি ছিল আমার জন্য অনুপস্থিত অংশ - জাভা প্রতিচ্ছবি ব্যবহার করে getContext () দিয়ে শুরু ক্লিক হ্যান্ডলারটি খুঁজে পেতে। ক্লিকটি কীভাবে কোনও খণ্ড থেকে ক্রিয়াকলাপে প্রচার করে তা আমার কাছে কিছুটা রহস্যজনক ছিল।
অ্যান্ড্রু কুইজার

15

এখানে খুব ভাল উত্তর আছে, তবে আমি একটি লাইন যুক্ত করতে চাই:

ইন android:onclickXML- এর, অ্যান্ড্রয়েড ব্যবহার জাভা প্রতিফলন এই হ্যান্ডেল দৃশ্যের অন্তরালে।

এবং এখানে যেমন বর্ণনা করা হয়েছে, প্রতিচ্ছবি সর্বদা কর্মক্ষমতাটি ধীর করে দেয়। (বিশেষ করে ডালভিক ভিএম)। নিবন্ধকরণ onClickListenerএকটি ভাল উপায়।


5
এটি অ্যাপ্লিকেশনটিকে ধীর করতে পারে কত? :) আধা মিলিসেকেন্ড; এমনকি না? প্রকৃতপক্ষে লেআউটটি স্ফীত করার তুলনায় এটি পালক এবং তিমির মতো
কনরাড মোরাওস্কি

14

মনে রাখবেন যে আপনি যদি অনক্লিক এক্সএমএল বৈশিষ্ট্যটি ব্যবহার করতে চান তবে সংশ্লিষ্ট পদ্ধতিতে একটি প্যারামিটার থাকতে হবে, যার প্রকারটি XML অবজেক্টের সাথে মেলে।

উদাহরণস্বরূপ, একটি বোতাম আপনার নামের সাথে স্ট্রিংয়ের মাধ্যমে আপনার পদ্ধতির সাথে সংযুক্ত হবে: android:onClick="MyFancyMethod"তবে পদ্ধতি ঘোষণার মাধ্যমে দেখাতে হবে: ...MyFancyMethod(View v) {...

আপনি যদি এই বৈশিষ্ট্যটি কোনও মেনু আইটেমে যুক্ত করার চেষ্টা করছেন , এটি এক্সএমএল ফাইলে ঠিক একই বাক্য গঠন করবে তবে আপনার পদ্ধতিটি হিসাবে ঘোষণা করা হবে:...MyFancyMethod(MenuItem mi) {...


6

ক্লিক শ্রোতাদের আপনার সেট করার আর একটি উপায় হ'ল এক্সএমএল ব্যবহার করা। স্রেফ অ্যান্ড্রয়েড যুক্ত করুন: আপনার ট্যাগটিতে অন ক্লিক ক্লিক করুন।

যখনই সম্ভব বেনামে জাভা ক্লাসে এক্সএমএল বৈশিষ্ট্যটি "অনক্লিক" ব্যবহার করা ভাল অনুশীলন।

প্রথমত, কোডের পার্থক্যটি একবার দেখে নেওয়া যাক:

এক্সএমএল অ্যাট্রিবিউট / অন ক্লিকে অ্যাট্রিবিউট

এক্সএমএল অংশ

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

জাভা অংশ

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

বেনামে জাভা ক্লাস / সেটঅনক্লিকলিস্টনার

এক্সএমএল অংশ

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

জাভা অংশ

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

বেনামে জাভা ক্লাসে এক্সএমএল অ্যাট্রিবিউট ব্যবহার করার সুবিধাগুলি এখানে রয়েছে:

  • বেনামি জাভা ক্লাসের সাহায্যে আমাদের সর্বদা আমাদের উপাদানগুলির জন্য একটি আইডি নির্দিষ্ট করতে হবে, তবে এক্সএমএল বৈশিষ্ট্য আইডি বাদ দেওয়া যেতে পারে।
  • বেনামি জাভা ক্লাসের সাহায্যে আমাদের সক্রিয়ভাবে ভিউয়ের অভ্যন্তরের উপাদানটি সন্ধান করতে হবে (ফাইন্ড ভিউআইআইডি অংশ), তবে এক্সএমএল বৈশিষ্ট্য সহ অ্যান্ড্রয়েড আমাদের জন্য এটি করে।
  • বেনামে জাভা ক্লাসে কমপক্ষে 5 টি লাইন কোডের প্রয়োজন যা আমরা দেখতে পাচ্ছি, তবে এক্সএমএল বৈশিষ্ট্য সহ 3 টি লাইন কোডই যথেষ্ট।
  • বেনামে জাভা ক্লাসের সাথে আমাদের আমাদের পদ্ধতির নাম "অনক্লিক" রাখতে হবে, তবে এক্সএমএল বৈশিষ্ট্য সহ আমরা আমাদের যে কোনও নাম যুক্ত করতে পারি, যা আমাদের কোডের পাঠযোগ্যতার সাথে নাটকীয়ভাবে সহায়তা করবে।
  • গুগল এপিআই লেভেল 4 রিলিজের সময় এক্সএমএল "অনক্লিক" বৈশিষ্ট্য যুক্ত করেছে, যার অর্থ এটি কিছুটা আধুনিক সিনট্যাক্স এবং আধুনিক বাক্য গঠন প্রায় সর্বদা আরও ভাল।

অবশ্যই, এক্সএমএল বৈশিষ্ট্যটি ব্যবহার করা সবসময় সম্ভব নয়, এখানে কারণগুলি আমরা এটি বেছে নিই নি:

  • আমরা যদি টুকরো টুকরো করে কাজ করছি। অনক্লিক বৈশিষ্ট্যটি কেবলমাত্র একটি ক্রিয়াকলাপে যুক্ত করা যেতে পারে, সুতরাং আমাদের যদি খণ্ড থাকে, তবে আমাদের একটি বেনাম শ্রেণি ব্যবহার করতে হবে।
  • আমরা যদি অনক্লিক শ্রোতাদের একটি পৃথক শ্রেণিতে নিয়ে যেতে চাই (সম্ভবত এটি খুব জটিল এবং / অথবা আমরা আমাদের অ্যাপ্লিকেশনের বিভিন্ন অংশে এটি আবার ব্যবহার করতে চাই), তবে আমরা এক্সএমএল বৈশিষ্ট্যটি ব্যবহার করতে চাই না পারেন।

এবং দয়া করে নোট করুন যে এক্সএমএল বৈশিষ্ট্যগুলি ব্যবহার করে ডাকা ফাংশনটি সর্বদা সর্বজনীন হওয়া উচিত এবং যদি সেগুলি ব্যক্তিগত মুরগি হিসাবে ঘোষিত হয় তবে এটি ব্যতিক্রম ঘটবে।
বেস্টিন জন

5

জাভা 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);

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

পুনশ্চ. যারা কীভাবে আগ্রহী তাদের জন্য আমি কীভাবে অ্যান্ড্রয়েডে জাভা 8 ভাষার বৈশিষ্ট্যটি ব্যবহার করতে পারি, এটি রেট্রোলম্বদা গ্রন্থাগারের সৌজন্যে ।


5

এক্সএমএল অ্যাট্রিবিউট ব্যবহার করে আপনাকে কেবল কোনও ক্লাসের পরিবর্তে কোনও পদ্ধতি নির্ধারণ করতে হবে তাই আমি ভাবছিলাম যে এটি কোডের মাধ্যমেও করা যেতে পারে এবং এক্সএমএল লেআউটে নয়।

হ্যাঁ, আপনি নিজের তৈরি করতে পারেন fragmentবা activityবাস্তবায়ন করতে পারেনView.OnClickListener

এবং আপনি কোডে আপনার নতুন দর্শন বস্তুগুলির সূচনা করার সময় আপনি কেবল পারেন mView.setOnClickListener(this);

এবং এটি স্বয়ংক্রিয়ভাবে onClick(View v)আপনার fragmentবা activityইত্যাদির পদ্ধতিটি ব্যবহার করার জন্য কোডে সমস্ত দৃশ্য অবজেক্টগুলিকে স্বয়ংক্রিয়ভাবে সেট করে ।

কোন ভিউটিকে onClickপদ্ধতিটি ডেকেছে তা আলাদা করতে, আপনি পদ্ধতিটিতে একটি স্যুইচ স্টেটমেন্ট ব্যবহার করতে পারেন v.getId()

এই উত্তরটি "কোডের মাধ্যমে সম্ভব নয়" বলে যে উত্তর দেয় তার চেয়ে আলাদা This


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

রুইভোর জবাবকে সমর্থন করে, হ্যাঁ আপনাকে অ্যান্ড্রয়েডের এক্সএমএল অনক্লিকটিতে ব্যবহার করতে সক্ষম হতে আপনাকে "পাবলিক" হিসাবে পদ্ধতিটি ঘোষণা করতে হবে - আমি এপিআই লেভেল 8 (মিনিসডেক ...) থেকে 16 (টার্গেটএসডিকে ...) লক্ষ্য করে একটি অ্যাপ্লিকেশন বিকাশ করছি।

আমি আমার পদ্ধতিটি ব্যক্তিগত হিসাবে ঘোষণা করছিলাম এবং এটি ত্রুটি সৃষ্টি করেছিল, কেবল এটিকে জনসাধারণের দুর্দান্ত কাজ হিসাবে ঘোষণা করে।


এটি প্রদর্শিত হয় যে হোস্টিং ক্রিয়াকলাপের ক্লাসে ঘোষিত ভেরিয়েবলগুলি ঘোষিত কলব্যাকের সুযোগে ব্যবহার করা যাবে না; বান্ডেল অ্যাক্টিভিটি.এমবান্ডেল আমার ফ্যানসিমেথোড () এ ব্যবহার করা হলে একটি অবৈধ স্ট্যাটএক্সেপশন / নলপয়েন্টার এক্সসেপশন নিক্ষেপ করবে।
কায়সৌর

2

সতর্কতা অবলম্বন করা আবশ্যক, যদিও android:onClickএক্সএমএল হাতল ক্লিক করার জন্য একটি সুবিধাজনক উপায় মনে করা হয়, setOnClickListenerবাস্তবায়ন কিছু যোগ চেয়ে অতিরিক্ত না onClickListener। প্রকৃতপক্ষে, এটি দৃশ্যের সম্পত্তিটিকে clickableসত্য করে তুলেছে।

ফোন কন্সট্রাক্টরের মতে এটি বেশিরভাগ অ্যান্ড্রয়েড বাস্তবায়নে কোনও সমস্যা নাও হতে পারে, বোতামটি সর্বদা ক্লিকযোগ্য = সত্যের জন্য ডিফল্ট থাকে তবে কিছু ফোন মডেলের অন্যান্য কনস্ট্রাক্টরের ডিফল্ট ক্লিকযোগ্য = অ বোতামের ভিউগুলিতে মিথ্যা থাকতে পারে।

সুতরাং এক্সএমএল সেট করা যথেষ্ট নয়, আপনাকে android:clickable="true"নন বোতামে যোগ করার জন্য সর্বদা চিন্তা করতে হবে এবং যদি আপনার এমন ডিভাইস থাকে যেখানে ডিফল্ট ক্লিকযোগ্য = সত্য হয় এবং আপনি এই এক্সএমএল বৈশিষ্ট্যটি একবারে ভুলে যেতে ভুলে যান তবে আপনি খেয়াল করবেন না রানটাইমের সময় সমস্যাটি কিন্তু বাজারে প্রতিক্রিয়া পাবেন যখন তা আপনার গ্রাহকদের হাতে থাকবে!

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

সুতরাং আপনি যদি কখনও সমস্যা না করতে চান এবং এটি নিয়ে কখনই ভাবেন না, তবে setOnClickListenerমন্তব্য হিসাবে বাটারনিফের মতো লাইব্রেরি ব্যবহার করা ভাল better@OnClick(R.id.button)


onClickXML গুণটি এছাড়াও সেট করে clickable = trueকারণ এটি কল setOnClickListenerউপর Viewঅভ্যন্তরীণভাবে
ফ্লোরিয়ান ওয়ালথার

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

জাভা ফাইলে আপনাকে এই পদ্ধতির মতো একটি পদ্ধতি লিখতে হবে।

public void register(View view) {
}

0

আমি এই কোডটি এক্সএমএল ফাইলে লিখছি ...

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

আমি দেখতে পাচ্ছি না কীভাবে এটি প্রশ্নের উত্তর দেয় - প্রশ্নকর্তা বেনাম শ্রেণি তৈরি করা এড়াতে এবং পরিবর্তে একটি শ্রেণি পদ্ধতি ব্যবহার করতে চান।
আজশোর্ট

0

আপনার জীবনকে আরও সহজ করে তুলতে এবং সেটঅনিক্লিক্লিস্টার () এ বেনামে ক্লাস এড়ানোর জন্য নীচের মত একটি ভিউ.অন ক্লিক ক্লিস্টসনার ইন্টারফেস প্রয়োগ করুন:

পাবলিক ক্লাস ইয়োরক্লাস কমনএকটিভিটি প্রয়োগগুলি বাস্তবায়িত করে View.OnClickListener, ...

এটি এড়ানো:

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.