当前位置:   article > 正文

Android学习笔记(七):按钮Button的常用方法_android写一个button

android写一个button

目录

一、Button 与 TextView

二、xml添加点击事件监听

 三、java实现按钮点击事件监听

1、常用写法

2、非常用写法

四、监听长按按钮事件

五、按钮的使能

六、练习

七、总结


一、Button 与 TextView

  1. <TextView
  2. android:layout_width="match_parent"
  3. android:layout_height="wrap_content"
  4. android:text="@string/text_view"
  5. android:textSize="20sp" />
  6. <Button
  7. android:layout_width="match_parent"
  8. android:layout_height="wrap_content"
  9. android:text="@string/button_view"
  10. android:textSize="20sp" />

/*
* 按钮控件Button由TextView派生而来,区别:
* Button有默认按钮背景,而TextView默认无背景;
* Button文本内容是默认居中,TextView默认左对齐;
* */

二、xml添加点击事件监听

        在xml中添加并不常用,因为我们提到,xml布局和java实现最好要低耦合,相关性不大,这样才有利于开发移植。但我们还是要去了解学习,这样别人写了我们也能看懂。

  1. <Button
  2. android:layout_width="match_parent"
  3. android:layout_height="wrap_content"
  4. android:onClick="doClick"
  5. android:text="doClick"
  6. android:textSize="20sp" />
  7. <TextView
  8. android:id="@+id/current_time"
  9. android:layout_width="match_parent"
  10. android:layout_height="wrap_content"
  11. android:text="@string/text_view"
  12. android:textSize="25sp" />

        从代码中可以看到,添加了一个onClick属性,属性值为"doClick",其含义就是:当我点击这个按钮时,就会去实现doClick()函数的内容,因此,在java实现中必须实现doClick函数; 其次,也添加了一个TextView来显示实现的内容。java部分代码如下所示。

  1. public class MainActivity extends AppCompatActivity {
  2. private TextView mCurrentTime;
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_main);
  7. initUI();
  8. }
  9. private void initUI() {
  10. mCurrentTime = findViewById(R.id.current_time);
  11. }
  12. public void doClick(View view) {
  13. // 点击按钮后实现的内容逻辑
  14. flashText(view);
  15. }
  16. private void flashText(View view) {
  17. String currentTime = String.format("%s current time: %s",
  18. ((Button) view).getText(), DateUtil.getCurrentTime());
  19. mCurrentTime.setText(currentTime);
  20. }
  21. }

        在MainActivity类中,实现的逻辑就是先加载xml布局,再实现doClick函数。其中需要注意的是:

1、在加载xml布局时,最好把它单独写一个函数,如initUI,我觉得这样写的话,可以增加可读性,因为如果需要添加的布局很多,这样在onCreate中就会写大量代码,而写在一个函数里,一眼就知道这个逻辑流程是什么;

2、mCurrentTime这个TextView我写成私有成员变量,这样可以很方便的对其进行操作;

3、我在doClick中调用了flashText()函数,整个逻辑就是在点击按钮时,mCurrentTime这个TextView显示内容就会被修改为按钮的text属性值和当前时间;

4、DateUtil.getCurrentTime() 这个是我实现的类和其方法来显示时间,代码如下:

  1. package com.example.texttest.Util;
  2. import java.text.SimpleDateFormat;
  3. import java.util.Date;
  4. public class DateUtil {
  5. public static String getCurrentTime() {
  6. // "HH:mm:ss" 表示显示的时间格式;
  7. SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
  8. return sdf.format(new Date());
  9. }
  10. }

         最终的效果如下所示,点击按钮后,显示了doClick以及当前时间

 三、java实现按钮点击事件监听

1、常用写法

        首先,在xml布局文件中,我们添加一个Button布局,如下所示。因为要使用它,所以给它一个id。

  1. <Button
  2. android:id="@+id/button1"
  3. android:layout_width="match_parent"
  4. android:layout_height="wrap_content"
  5. android:text="Button1"
  6. android:textSize="20sp" />

        然后在java中实现对应的逻辑,部分代码如下

  1. public class MainActivity extends AppCompatActivity
  2. implements View.OnClickListener {
  3. private TextView mCurrentTime;
  4. private Button mButton1;
  5. @Override
  6. protected void onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.activity_main);
  9. initUI();
  10. setClickListener();
  11. }
  12. private void initUI() {
  13. mCurrentTime = findViewById(R.id.current_time);
  14. mButton1 = findViewById(R.id.button1);
  15. }
  16. private void setClickListener() {
  17. // 设置事件监听
  18. mButton1.setOnClickListener(this);
  19. }
  20. @Override
  21. public void onClick(View view) {
  22. if (view.getId() == R.id.button1) {
  23. // 点击按钮后实现的内容逻辑
  24. flashText(view);
  25. }
  26. }
  27. private void flashText(View view) {
  28. String currentTime = String.format("%s current time: %s",
  29. ((Button) view).getText(), DateUtil.getCurrentTime());
  30. mCurrentTime.setText(currentTime);
  31. }
  32. }

1、同样在initUI中加载对应的布局mButton1 = findViewById(R.id.button1);且用同样的思维,添加一个setClickListener函数来统一设置事件监听逻辑;

2、需要让该类实现接口 implements View.OnClickListener ,实现接口onClick(View view);

3、因为在该类中可能有多个按钮,所以要区分到底是点击了那个按钮,并实现对应按钮的逻辑;通过view.getId()来获取按钮id进行区分

        你可能会有疑惑,为什么需要实现View.OnClickListener这个接口,又为什么setOnClickListener(this) 传入的参数是this?下面就进行简单解答。

2、非常用写法

        首先我们通过看setOnClickListener函数源码可以看到,入参需要传递的是View.OnClickListener接口实例,因此,我们可以这样写代码逻辑:

  1. public class MainActivity extends AppCompatActivity {
  2. private Button mButton1;
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_main);
  7. initUI();
  8. setClickListener();
  9. }
  10. private void initUI() {
  11. mCurrentTime = findViewById(R.id.current_time);
  12. mButton1 = findViewById(R.id.button1);
  13. }
  14. private void setClickListener() {
  15. // 设置事件监听
  16. mButton1.setOnClickListener(new MyOnClickListener());
  17. }
  18. static class MyOnClickListener implements View.OnClickListener {
  19. @Override
  20. public void onClick(View view) {
  21. // 点击按钮后实现的内容逻辑
  22. }
  23. }
  24. }
  25. }

        代码中,首先实现了一个内部类MyOnClickListener,并且它实现接口View.OnClickListener和方法onClick;但是可以明显看到这样写的弊端,就是如果我需要多个按钮,岂不是要写多个内部类。

        因此,我们常采用第一种写法,让该类直接实现接口和方法,并通过id来区分不同的按钮,现在你也知道为什么传入的参数是this了吧,this指代的就是当前实现了View.OnClickListener接口的类的实例。

四、监听长按按钮事件

        按钮除了点击,还有长按操作,在按按钮低于500ms时触发点击事件,超过500ms时触发长按事件。 部分代码如下

  1. // xml
  2. <Button
  3. android:id="@+id/long_button"
  4. android:layout_width="match_parent"
  5. android:layout_height="wrap_content"
  6. android:text="LongButton"
  7. android:textSize="20sp" />
  8. public class MainActivity extends AppCompatActivity
  9. implements View.OnClickListener {
  10. private Button mButton1;
  11. private Button mLongButton;
  12. @Override
  13. protected void onCreate(Bundle savedInstanceState) {
  14. super.onCreate(savedInstanceState);
  15. setContentView(R.layout.activity_main);
  16. initUI();
  17. setClickListener();
  18. }
  19. private void initUI() {
  20. mButton1 = findViewById(R.id.button1);
  21. mLongButton = findViewById(R.id.long_button);
  22. }
  23. private void setClickListener() {
  24. // 设置事件监听
  25. mButton1.setOnClickListener(this);
  26. // 写法一
  27. /*mLongButton.setOnLongClickListener(new View.OnLongClickListener() {
  28. @Override
  29. public boolean onLongClick(View view) {
  30. // 实现长按后的逻辑
  31. /*OnLongClickListener()会返回一个boolean值
  32. * 该值表示是否消耗这个点击事件
  33. * true表示消耗点击事件
  34. * false表示不消耗,那么该事件还可以传给它的父控件*/
  35. return true;
  36. }
  37. });*/
  38. // 写法二:lambda
  39. mLongButton.setOnLongClickListener(view -> {
  40. flashText(view);
  41. return true;
  42. });
  43. }
  44. @Override
  45. public void onClick(View view) {
  46. if (view.getId() == R.id.button1) {
  47. }
  48. }
  49. }

        在xml文件中还是一样的设置,在Java中同样的加载布局并设置事件监听(setOnLongClickListener),这个接口需要传入实现了OnLongClickListener这个接口的实例对象,并实现boolean onLongClick(View var1); 这个方法。我想你应用学会了通过前两种方式来实现设置长按事件监听,这里我再通过另一种写法(写法二:lambda)。

        此外OnLongClickListener()会返回一个boolean值,该值表示是否消耗这个点击事件,true表示消耗点击事件,false表示不消耗,那么该事件还可以传给它的父控件进行处理。

五、按钮的使能

        我们还可以给按钮设置是否使能,即设置该按钮是否可以点击,就比如当我们日常发生验证码时,在60s内无法再次发送,这个时候就是通过使能设置让按钮无法再进行点击。部分代码实现如下所示。xml中通过enabled属性设置使能状态,true为可点击,false为不可点击;也可以在java中通过setEnabled()设置使能状态。

  1. // xml
  2. <Button
  3. android:id="@+id/button_test"
  4. android:layout_width="match_parent"
  5. android:layout_height="wrap_content"
  6. android:text="Button Test"
  7. android:enabled="false"
  8. android:textSize="20sp" />
  9. //java
  10. Button mButtonTest;
  11. mButtonTest = findViewById(R.id.button_test);
  12. mButtonTest.setEnabled(true);

六、练习

        这里给你们出了一个练习题,效果如下所示

        我们需要添加三个按钮(Button Enable/Button Disable/Button Test)和一个TextView(这里我直接使用的之前的),然后在Button Test默认使能false,不可点击,这时按钮背景为灰色,你可以像我一样,字体颜色也设置为灰色;当点击Button Enable设置Button Test可以点击,并点击Button Test按钮后在TextView中显示当前时间和哪个按钮;当点击Button Disable按钮时设置Button Test按钮不可点击。下面给出了我实现的APP的xml代码和java代码逻辑。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical"
  6. android:padding="5sp">
  7. <TextView
  8. android:layout_width="match_parent"
  9. android:layout_height="wrap_content"
  10. android:text="@string/text_view"
  11. android:textSize="20sp" />
  12. <Button
  13. android:layout_width="match_parent"
  14. android:layout_height="wrap_content"
  15. android:text="@string/button_view"
  16. android:textSize="20sp" />
  17. <Button
  18. android:layout_width="match_parent"
  19. android:layout_height="wrap_content"
  20. android:onClick="doClick"
  21. android:text="doClick"
  22. android:textSize="20sp" />
  23. <TextView
  24. android:id="@+id/current_time"
  25. android:layout_width="match_parent"
  26. android:layout_height="wrap_content"
  27. android:text="@string/text_view"
  28. android:textSize="25sp" />
  29. <Button
  30. android:id="@+id/button1"
  31. android:layout_width="match_parent"
  32. android:layout_height="wrap_content"
  33. android:text="Button1"
  34. android:textSize="20sp" />
  35. <Button
  36. android:id="@+id/long_button"
  37. android:layout_width="match_parent"
  38. android:layout_height="wrap_content"
  39. android:text="LongButton"
  40. android:textSize="20sp" />
  41. <LinearLayout
  42. android:layout_width="match_parent"
  43. android:layout_height="wrap_content"
  44. android:orientation="horizontal">
  45. <Button
  46. android:id="@+id/button_enable"
  47. android:layout_width="0dp"
  48. android:layout_height="wrap_content"
  49. android:layout_weight="1"
  50. android:text="Button Enable"
  51. android:textSize="20sp" />
  52. <Button
  53. android:id="@+id/button_disable"
  54. android:layout_width="0dp"
  55. android:layout_height="wrap_content"
  56. android:layout_weight="1"
  57. android:text="Button Disable"
  58. android:textSize="20sp" />
  59. </LinearLayout>
  60. <Button
  61. android:id="@+id/button_test"
  62. android:layout_width="match_parent"
  63. android:layout_height="wrap_content"
  64. android:text="Button Test"
  65. android:enabled="false"
  66. android:textSize="20sp" />
  67. </LinearLayout>
  1. package com.example.texttest;
  2. import androidx.appcompat.app.AppCompatActivity;
  3. import android.graphics.Color;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.widget.Button;
  7. import android.widget.TextView;
  8. import com.example.texttest.Util.DateUtil;
  9. public class MainActivity extends AppCompatActivity implements View.OnClickListener {
  10. /*
  11. * 按钮控件Button由TextView派生而来,区别:
  12. * Button有默认按钮背景,而TextView默认无背景;
  13. * Button文本内容是默认居中,TextView默认左对齐;
  14. * */
  15. private TextView mCurrentTime;
  16. private Button mButton1;
  17. private Button mLongButton;
  18. private Button mButtonEnable;
  19. private Button mButtonDisable;
  20. private Button mButtonTest;
  21. @Override
  22. protected void onCreate(Bundle savedInstanceState) {
  23. super.onCreate(savedInstanceState);
  24. setContentView(R.layout.activity_main);
  25. initUI();
  26. setClickListener();
  27. }
  28. private void initUI() {
  29. mCurrentTime = findViewById(R.id.current_time);
  30. mButton1 = findViewById(R.id.button1);
  31. mLongButton = findViewById(R.id.long_button);
  32. mButtonEnable = findViewById(R.id.button_enable);
  33. mButtonDisable = findViewById(R.id.button_disable);
  34. mButtonTest = findViewById(R.id.button_test);
  35. }
  36. private void setClickListener() {
  37. mButton1.setOnClickListener(this);
  38. /*mLongButton.setOnLongClickListener(new View.OnLongClickListener() {
  39. @Override
  40. public boolean onLongClick(View view) {
  41. flashText(view);
  42. return true;
  43. }
  44. });*/
  45. mLongButton.setOnLongClickListener(view -> {
  46. flashText(view);
  47. /*OnLongClickListener()会返回一个boolean值
  48. * 该值表示是否消耗这个点击事件
  49. * true表示消耗点击事件
  50. * false表示不消耗,那么该事件还可以传给它的父控件*/
  51. return true;
  52. });
  53. mButtonEnable.setOnClickListener(this);
  54. mButtonDisable.setOnClickListener(this);
  55. mButtonTest.setOnClickListener(this);
  56. }
  57. public void doClick(View view) {
  58. flashText(view);
  59. }
  60. @Override
  61. public void onClick(View view) {
  62. if (view.getId() == R.id.button1) {
  63. flashText(view);
  64. }
  65. else if (view.getId() == R.id.button_enable) {
  66. mButtonTest.setEnabled(true);
  67. mButtonTest.setTextColor(Color.WHITE);
  68. }
  69. else if (view.getId() == R.id.button_disable) {
  70. mButtonTest.setEnabled(false);
  71. mButtonTest.setTextColor(Color.GRAY);
  72. }
  73. else if (view.getId() == R.id.button_test) {
  74. flashText(view);
  75. }
  76. }
  77. private void flashText(View view) {
  78. String currentTime = String.format("%s current time: %s", ((Button) view).getText(), DateUtil.getCurrentTime());
  79. mCurrentTime.setText(currentTime);
  80. }
  81. }

        所使用的xml布局设计和java逻辑通过前几章的学习和今天的学习,我相信你不仅可以读懂它,自己也可以独自实现它。 

七、总结

        在本章中,我们主要学习Button按钮控件的使用,包括添加按钮,设置按钮点击、长按事件监听(常用写法和非常用写法),以及设置按钮使能状态(是否可以点击)。最后给出了一个练习,和整个xml、java代码。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/494250
推荐阅读
相关标签
  

闽ICP备14008679号