Android: how to handle button click

后端 未结 10 2168
刺人心
刺人心 2020-11-27 11:08

Having a solid experience in non-Java and non-Android area, I\'m learning Android.

I have a lot of confusion with different areas, one of them is how to handle butt

相关标签:
10条回答
  • 2020-11-27 11:22

    Step 1:Create an XML File:

    <?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>
    

    Step 2:Create MainActivity:

    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!

    0 讨论(0)
  • 2020-11-27 11:26

    Question#1 - These are the only way to handle view clicks.

    Question#2 -
    Option#1/Option#4 - There's not much difference between option#1 and option#4. The only difference I see is in one case activity is implementing the OnClickListener, whereas, in the other case, there'd be an anonymous implementation.

    Option#2 - In this method an anonymous class will be generated. This method is a bit cumborsome, as, you'd need to do it multiple times, if you have multiple buttons. For Anonymous classes, you have to be careful for handling memory leaks.

    Option#3 - Though, this is a easy way. Usually, Programmers try not to use any method until they write it, and hence this method is not widely used. You'd see mostly people use Option#4. Because it is cleaner in term of code.

    0 讨论(0)
  • 2020-11-27 11:29

    Question 1: Unfortunately the one in which you you say is most intuitive is the least used in Android. As I understand, you should separate your UI (XML) and computational functionality (Java Class Files). It also makes for easier debugging. It is actually a lot easier to read this way and think about Android imo.

    Question 2: I believe the two mainly used are #2 and #3. I will use a Button clickButton as an example.

    2

    is in the form of an anonymous class.

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

    This is my favorite as it has the onClick method right next to where the button variable was set with the findViewById. It seems very neat and tidy that everything that deals with this clickButton Button View is located here.

    A con that my coworker comments, is that imagine you have many views that need onclick listener. You can see that your onCreate will get very long in length. So that why he likes to use:

    3

    Say you have, 5 clickButtons:

    Make sure your Activity/Fragment implement 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
        }
    }
    

    This way as my coworker explains is neater in his eyes, as all the onClick computation is handled in one place and not crowding the onCreate method. But the downside I see is, that the:

    1. views themselves,
    2. and any other object that might be located in onCreate used by the onClick method will have to be made into a field.

    Let me know if you would like more information. I didn't answer your question fully because it is a pretty long question. And if I find some sites I will expand my answer, right now I'm just giving some experience.

    0 讨论(0)
  • 2020-11-27 11:29

    Option 1 and 2 involves using inner class that will make the code kind of clutter. Option 2 is sort of messy because there will be one listener for every button. If you have small number of button, this is okay. For option 4 I think this will be harder to debug as you will have to go back and fourth the xml and java code. I personally use option 3 when I have to handle multiple button clicks.

    0 讨论(0)
提交回复
热议问题