android - एंड्रॉइड में बटन घटनाओं को परिभाषित करने के लिए सबसे अच्छा अभ्यास




5 Answers

कोड के साथ सबसे अच्छा तरीका यहां दिया गया है:

  public class MyTest extends Activity implements OnClickListener{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
     //... some other code here to init the layout
        Button btn1 = (Button)findViewById(R.id.button1);
        Button btn2 = (Button)findViewById(R.id.button2);
        btn1.setOnClickListener(this);
        btn2.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch(v.getId()){
            case R.id.button1:
                break;
            case R.id.button2:
                break;
        }
    }
}

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

कक्षा इंटरफेस बनाना केवल तभी अच्छा होता है जब आप अलग-अलग वर्गों या गतिविधियों के बीच संचार प्राप्त करना चाहते हैं और चीजों को अलग रखना चाहते हैं। इसके अलावा इसके लिए उप-वर्ग बनाने का एक बुरा अभ्यास है।

android button event-handling

मेरे पास एक्सएमएल में परिभाषित एक Layout है जिसमें कई Button

वर्तमान में मैं बटन के खिलाफ ईवेंट हैंडलर को परिभाषित करने के लिए OnCreate विधि में ऐसा कर रहा हूं:

public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Button newPicButton = (Button)findViewById(R.id.new_button);
    newPicButton.setOnClickListener(btnListener);
    ..... similarly for other buttons too
    .....
}

Button के onActivityResult घटना के अंदर, onActivityResult एक तस्वीर प्राप्त करने के लिए एक कैमरा Intent लॉन्च किया और onActivityResult कॉलबैक के अंदर मैं फिर से इस तरह के View को सेट करने के साथ ईवेंट हैंडलर सेट कर रहा हूं:

protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    setContentView(R.layout.main);
    Button newPicButton = (Button)findViewById(R.id.new_button);
    newPicButton.setOnClickListener(btnListener);
    ...similarly for other buttons too
}

मैं एंड्रॉइड के लिए नया हूं और हर बार एक घटना को फिर से परिभाषित करने का यह दृष्टिकोण मेरे लिए काफी गंदा लगता है। मैं जानना चाहता हूं कि इस तरह के परिदृश्यों में बटन इवेंट हैंडलर को परिभाषित करने के मामले में सबसे अच्छा अभ्यास क्या है।

संपादित करें: मेरी पूरी कक्षा चिपकाना

public class CameraAppActivity extends Activity 
{
    /** Called when the activity is first created. */

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button newPicButton = (Button)findViewById(R.id.new_button);
        newPicButton.setOnClickListener(btnListener);
    }

    //---create an anonymous class to act as a button click listener---
    private OnClickListener btnListener = new OnClickListener()
    {

        public void onClick(View v)
        {   
             //Intent newPicIntent = new Intent(v.getContext(), NewPictureActivity.class);
             //startActivityForResult(newPicIntent, 0);
            Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(cameraIntent, 999);
        } 

    };  

    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    {  

        setContentView(R.layout.main);
        Button newPicButton = (Button)findViewById(R.id.new_button);
        newPicButton.setOnClickListener(btnListener);

       //if I comment last two lines nothing happens when I click on button

    }  

मुख्य सवाल है

setContentView(R.layout.main);
Button newPicButton = (Button)findViewById(R.id.new_button);
newPicButton.setOnClickListener(btnListener);

onActivityResult अंदर घटनाओं को फिर से पंजीकृत onActivityResult .. क्या यह सही दृष्टिकोण है? या मुझ से कुछ गलत हो रहा है? क्योंकि अगर मैं ईवेंट को फिर से पंजीकृत नहीं करता हूं तो कुछ भी नहीं होता है जब मैं बटन पर क्लिक करता हूं।




परिभाषित कोई सर्वोत्तम अभ्यास नहीं है। यह उपयोग के मामले पर भारी निर्भर करता है। आप बटन के onClick विशेषता का उपयोग करके उन्हें अपने एक्सएमएल लेआउट में परिभाषित कर सकते हैं।

एक्सएमएल उदाहरण:

<!-- Stuff -->
<Button android:id="@+id/my_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Click Me!"
    android:onClick="myClickMethod" />

जावा उदाहरण:

// stuff
public void myClickMethod(View v) {
    // more stuff
}

इस तरह आपको OnClickListener स्वयं लागू करने की आवश्यकता नहीं है। आप प्रत्येक बटन को उसी पर क्लिक कर सकते हैं क्लिक करें और फिर बस प्रति-दृश्य आधार पर निर्णय लें कि कौन सी कार्रवाई ट्रिगर करने के लिए है या आप प्रत्येक बटन के लिए एक अलग विधि रख सकते हैं।

आम तौर पर मैं एक से अधिक बटन के लिए एक OnClickListener का उपयोग करने के खिलाफ सलाह देता हूं। यह समझना आसान है कि प्रत्येक श्रोता को क्या करना चाहिए यदि आप वर्णनात्मक नामों का उपयोग करते हैं जो आपको वैसे भी करना चाहिए।




@ हसन यह सबसे अच्छा तरीका है जो मैंने पाया है और जो हर बार मेरे लिए काम करता है।

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

                    <Button android:id="@+id/Button01"          
                        android:onClick="@string/method" 
                        android:focusable="true" android:clickable="true"
                        ">
                    </Button>
    
  • आरस्ट्रिंग फ़ाइल में निम्न पंक्ति जोड़ें

स्ट्रिंग नाम = "विधि"> बटन समारोह

  • Sample.java फ़ाइल में R.string में फ़ंक्शन को परिभाषित करने के लिए बटन के क्लिक पर कॉल किया जाएगा और इसे कुछ ऐसा दिखना चाहिए

    सार्वजनिक शून्य बटन समारोह (दृश्य देखें) {// बटन के क्लिक पर आपको पसंद है}




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




यहाँ देखें कि मैंने यह कैसे किया:

  1. बटन में एक्सएमएल फ़ाइल सेट एंड्रॉइड: onClick = "onClick"।
  2. आपकी गतिविधि में View.OnClickListener लागू करें।
  3. ऑनक्लिक विधि के अंदर स्विच कुंजी का उपयोग करें (नीचे के रूप में)।

@Override

public void onClick(View view) {
    Intent intent;
    switch(view.getId()){

        case R.id.home_button:
            //DO something
            intent = new Intent(HashTagActivity.this,MainActivity.class);
            startActivity(intent);
            break;
        case R.id.back_button:
            //DO something
             intent = new Intent(HashTagActivity.this,ClassActivity.class);
            startActivity(intent);
            break;
        case R.id.favorite_button:
            //DO something
            break;
        case R.id.copy_button:
            //DO something

            break;

    }
}

यह बढ़िया काम करता है।




Related