您的位置:首页 > 移动开发 > Android开发

Android----按钮单击事件的四种写法

2016-12-16 22:26 309 查看
【前言】

按钮少的时候用第三种的匿名内部类会比较快,比如写demo测试的时候或者登陆界面之类。

按钮多的时候一般选择第四种写法。

 

一、第一种写法:在XML文件中声明onClick属性(很少用)

在XML文件中显式指定控件的onClick属性,点击按钮时会利用反射的方式调用对应Activity中的onClick()方法。

(1)xml文件代码如下:

1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2     xmlns:tools="http://schemas.android.com/tools"
3     android:layout_width="match_parent"
4     android:layout_height="match_parent"
5     android:orientation="vertical" >
6
7     <Button
8         android:id="@+id/btn1"
9         android:layout_width="wrap_content"
10         android:layout_height="wrap_content"
11         android:onClick="onClick"
12         android:text="按钮1" />
13
14     <Button
15         android:id="@+id/btn2"
16         android:layout_width="wrap_content"
17         android:layout_height="wrap_content"
18         android:onClick="onClick"
19         android:text="按钮2" />
20
21 </LinearLayout>


上面的代码中,我们在第11行、18行指定了onClick属性,然后接下来在Activity中写一个onClick同名方法。

(2)MainActivity.java:

1 package com.vae01;
2
3 import android.app.Activity;
4 import android.content.DialogInterface.OnClickListener;
5 import android.os.Bundle;
6 import android.view.View;
7 import android.widget.Button;
8 import android.widget.ImageView;
9 import android.widget.TextView;
10 import android.widget.Toast;
11
12 public class MainActivity extends Activity {
13
14     private Button btn1, btn2;
15
16     @Override
17     protected void onCreate(Bundle savedInstanceState) {
18         super.onCreate(savedInstanceState);
19         setContentView(R.layout.activity_main);
20         initView();
21     }
22
23     // 方法:初始化View
24     private void initView() {
25         btn1 = (Button) findViewById(R.id.btn1);
26         btn2 = (Button) findViewById(R.id.btn2);
27     }
28
29     //方法:控件View的点击事件
30     public void onClick(View v) {
31         switch (v.getId()) {
32         case R.id.btn1:
33             Toast.makeText(MainActivity.this, "btn1", Toast.LENGTH_SHORT).show();
34             break;
35         case R.id.btn2:
36             Toast.makeText(MainActivity.this, "btn2", Toast.LENGTH_SHORT).show();
37             break;
38
39         default:
40             break;
41         }
42     }
43 }


注意,第30行的onClick()方法的权限是public,毕竟xml文件还要访问的嘛。

 

二、第二种写法:使用内部类(很少用)

(1)xml文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<Button
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮1" />

<Button
android:id="@+id/btn2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮2" />

</LinearLayout>


(2)MainActivity.java:

1 package com.vae01;
2
3 import android.app.Activity;
4 import android.os.Bundle;
5 import android.view.View;
6 import android.view.View.OnClickListener;
7 import android.widget.Button;
8 import android.widget.ImageView;
9 import android.widget.TextView;
10 import android.widget.Toast;
11
12 public class MainActivity extends Activity {
13
14     private Button btn1, btn2;
15
16     @Override
17     protected void onCreate(Bundle savedInstanceState) {
18         super.onCreate(savedInstanceState);
19         setContentView(R.layout.activity_main);
20         initView();
21     }
22
23     // 方法:初始化View
24     private void initView() {
25         btn1 = (Button) findViewById(R.id.btn1);
26         btn2 = (Button) findViewById(R.id.btn2);
27
28         btn1.setOnClickListener(new MyClickListener());
29         btn2.setOnClickListener(new MyClickListener());
30     }
31
32     class MyClickListener implements OnClickListener {
33         @Override
34         public void onClick(View v) {
35             switch (v.getId()) {
36             case R.id.btn1:
37                 Toast.makeText(MainActivity.this, "btn1", Toast.LENGTH_SHORT).show();
38                 break;
39             case R.id.btn2:
40                 Toast.makeText(MainActivity.this, "btn2", Toast.LENGTH_SHORT).show();
41                 break;
42             default:
43                 break;
44             }
45         }
46     }
47 } 


注意第28、29行:不要忘记了绑定监听器。

 

三、第三种写法:匿名内部类(适合场景:测试、或者只有单个button的时候。使用较多)

(1)xml文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<Button
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮1" />

<Button
android:id="@+id/btn2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮2" />

</LinearLayout>


(2)MainActivity.java:

1 package com.vae01;
2
3 import android.app.Activity;
4 import android.os.Bundle;
5 import android.view.View;
6 import android.view.View.OnClickListener;
7 import android.widget.Button;
8 import android.widget.Toast;
9
10 public class MainActivity extends Activity {
11
12     private Button btn1, btn2;
13
14     @Override
15     protected void onCreate(Bundle savedInstanceState) {
16         super.onCreate(savedInstanceState);
17         setContentView(R.layout.activity_main);
18         initView();
19     }
20
21     // 方法:初始化View
22     private void initView() {
23         btn1 = (Button) findViewById(R.id.btn1);
24         btn2 = (Button) findViewById(R.id.btn2);
25
26         btn1.setOnClickListener(new OnClickListener(){
27             @Override
28             public void onClick(View v) {
29                 Toast.makeText(MainActivity.this, "btn1", Toast.LENGTH_SHORT).show();
30             }
31
32         });
33
34         btn2.setOnClickListener(new OnClickListener(){
35             @Override
36             public void onClick(View v) {
37                 Toast.makeText(MainActivity.this, "btn2", Toast.LENGTH_SHORT).show();
38             }
39
40         });
41     }
42 }


 

四、第四种写法:Activity实现View.OnClickListener接口(最常用)

Activity继承View.OnClickListener,由Activity实现OnClick(View view)方法,在OnClick(View view)方法中用switch-case对不同id代表的button进行相应的处理

(1)xml代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<Button
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮1" />

<Button
android:id="@+id/btn2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮2" />

</LinearLayout>


(2)MainActivity.java:

1 package com.vae01;
2
3 import android.app.Activity;
4 import android.os.Bundle;
5 import android.view.View;
6 import android.view.View.OnClickListener;
7 import android.widget.Button;
8 import android.widget.Toast;
9
10 public class MainActivity extends Activity implements OnClickListener{
11
12     private Button btn1, btn2;
13
14     @Override
15     protected void onCreate(Bundle savedInstanceState) {
16         super.onCreate(savedInstanceState);
17         setContentView(R.layout.activity_main);
18         //初始化View
19         initView();
20     }
21
22     // 方法:初始化View
23     private void initView() {
24         btn1 = (Button) findViewById(R.id.btn1);
25         btn2 = (Button) findViewById(R.id.btn2);
26
27         //按钮绑定点击事件的监听器
28          btn1.setOnClickListener(this);
29          btn2.setOnClickListener(this);
30     }
31
32     //方法:按钮的单击事件
33     @Override
34     public void onClick(View v) {
35         switch (v.getId()) {
36         case R.id.btn1:
37             Toast.makeText(MainActivity.this, "btn1", Toast.LENGTH_SHORT).show();
38             break;
39         case R.id.btn2:
40             Toast.makeText(MainActivity.this, "btn2", Toast.LENGTH_SHORT).show();
41             break;
42         default:
43             break;
44         }
45     }
46 }


 

 


通过Eclipse可以在自己的应用程序中增加一个按钮,同时在main.xml中会自动增加如下的代码:

---

[html] view
plain copy

<Button  

    android:id="@+id/button1"  

    android:layout_width="wrap_content"  

    android:layout_height="wrap_content"  

    android:text="Button" />  



编译运行程序时,将会看到一个按钮。单击它时,没有任何的响应和动作。
需要我们手动增加代码为该按钮增加单击事件的响应。

为按钮增加单击事件的响应时有两种方式:

1、通过Button的setOnClickListener方法为该按钮绑定一个单击事件监听器,用于监听用户的单击事件。代码如下:

[java] view
plain copy

public class MyActivity extends Activity {  

    protected void onCreate(Bundle icicle) {  

        super.onCreate(icicle);  

  

        setContentView(R.layout.content_layout_id);  

  

        //手工增加代码开始  

        //将按钮绑定一个单操作的事件监听器。用于监听用户的单击操作。  

        final Button button = (Button) findViewById(R.id.button_id);  

        button.setOnClickListener(new View.OnClickListener() {  

            public void onClick(View v) {  

                // Perform action on click  

                //增加自己的代码......  

                final TextView text = (TextView) findViewById(R.id.textView1);  

                text.setText("OnClick. " + " ....");      

            }  

        });  

        //手工增加代码结束  

    }  

}  

上面的代码很简短,但不利于阅读。也可以使用下面的书写方式:

[java] view
plain copy

public class MyActivity extends Activity {  

  

    protected void onCreate(Bundle icicle) {  

        super.onCreate(icicle);  

  

        setContentView(R.layout.content_layout_id);  

  

        //手动增加代码开始  

        Button button = (Button) findViewById(R.id.button_id);  

        button.setOnClickListener(myOnClickListener);  

        //手动增加代码结束  

    }  

  

   //手动增加代码开始  

   private OnClickListener myOnClickListener = new OnClickListener() {  

       public void onClick(View v) {  

       //增加自己的代码......  

       final TextView text = (TextView) findViewById(R.id.textView1);  

       text.setText("OnClick. " + " ....");              

       }         

   };  

   //手动增加代码结束  

}  

2、通过修改main.xml中Button的属性,为按钮增加单击事件请求。修改的xml文件如下:

[html] view
plain copy

<Button  

    android:id="@+id/button1"  

    android:layout_width="wrap_content"  

    android:layout_height="wrap_content"  

    android:onClick="OnMySelfClick"  

    android:text="Button" />  

然后在.java文件中增加xml文件中提到的OnMySelfClick函数:

[java] view
plain copy

public class HelloAndroidActivity extends Activity {  

    /** Called when the activity is first created. */     

    @Override  

    public void onCreate(Bundle savedInstanceState) {  

        super.onCreate(savedInstanceState);  

        setContentView(R.layout.main);   

          

    }  

      

    /* ************************************ 

     *   按钮的单击操作处理函数。 

     *   下面的函数是一个按钮单击的处理函数。 

     *   它需要在layout的xml中将按钮增加一个OnClick的属性, 

     *   并指定它的处理函数。如下 

     *   

     *   android:onClick="OnMySelfClick" 

     *    

     *   这样的话,就不用再增加上面那些复杂的代码了。 

     *    

     * */  

    public void OnMySelfClick(View v)  

    {  

        final TextView text = (TextView) findViewById(R.id.textView1);  

        text.setText("OnMySelfClick. " + " ....");      

    }  

}  

第二种方法比较第一种方法简单了许多。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: