Android应用开发学习笔记——目录索引

本章介绍按钮(Button)控件的常见用法,结合前面Android应用开发(5)文本显示(TextView)介绍按钮(Button)监听点击和长按事件,禁用和启用等。

参考google官网:https://developer.android.com/reference/android/widget/Button

一、按键(Button)介绍

按钮控件Button由TextView派生而来,所以TextView拥有的属性和方法,Button均能使用,如上一章Android应用开发(5)文本显示(TextView)设置文本内容、文本大小、显示颜色,按钮(Button)控件均可使用。它们之间的区别有:

  1. Button拥有默认的按钮背景,而TextView默认无背景;
  2. Button的内部文本默认居中对齐,而TextView的内部文本默认靠左对齐;
  3. Button会默认将英文字母转为大写,而TextView保持原始的英文大小写;

与TextView相比,Button增加了两个新属性:

  1. textAllCaps属性,它指定了是否将英文字母转为大写,为true是表示自动转为大写,为false表示不做大写转换。
  2. onClick属性,它用来接管用户的点击动作,指定了点击按钮时要触发哪个方法;

由于按钮(Button)控件textAllCaps属性默认是true,表示全部转为大写。

如下图(1):

①没有设置textAllCaps属性,android:text全部转为大写了。

②设置了android:textAllCaps="false",按键显示文本和android:text一致,不会全部转为大写。

图(1)

在代码中可以通过setAllCaps方法设置。


Button button = (Button) findViewById(R.id.button);
button.setAllCaps(false);

二、Button点击和长按事件监听

Button控件有两种常用的监听器:

(1)点击监听器,通过setOnClickListener方法设置。按钮被按住少于500毫秒时,会触发点击事件。

(2)长按监听器,通过setOnLongClickListener方法设置。按钮被按住超过500毫秒时,会触发长按事件。

  1. 设置点击事件监听

如果一个页面只有一个按键,可以通过下面方法为这一个按键定义监听器,并设置邦定监监听器


mTextView = (TextView) findViewById(R.id.textView);

Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        String string = String.format("%s: 你点击了按键:%s",
                Utils.getNowTimeMs(), ((Button) v).getText());
        mTextView.setText(string);
    }
});

或者


mTextView = (TextView) findViewById(R.id.textView);

Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new MyOnClickListener());

class MyOnClickListener implements View.OnClickListener {
    @Override
    public void onClick(View v) {
        String string = String.format("%s: 你点击了按键:%s",
                Utils.getNowTimeMs(), ((Button) v).getText());
        mTextView.setText(string);
    }
}

但是如果一个activity中有许多按键,给每一个按键都定义自己的监听器,非常的费时费力。

更好的方法的注册统一的监听,在当前activity实现View.OnClickListener接口


public class MainActivity extends AppCompatActivity 
        implements View.OnClickListener {
    private TextView mTextView;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.i(TAG, "onCreate: " + Utils.getNowDateTime());
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(this);
        
        mTextView = (TextView) findViewById(R.id.textView);
    }
    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.button) {
            String string = String.format("%s: 你点击了按键:%s",
                    Utils.getNowTimeMs(), ((Button) v).getText());
            mTextView.setText(string);
        }
    }
}
  1. 设置长按事件监听

按键按住超过500ms,触发长按事件,和设置点击事件类似,可通过setOnLongClickListener方法设置长按监听,具体代码如下:


public class MainActivity extends AppCompatActivity 
        implements View.OnLongClickListener {
    private TextView mTextView;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.i(TAG, "onCreate: " + Utils.getNowDateTime());
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button buttonLongClick = (Button) findViewById(R.id.longClickButton);
        buttonLongClick.setOnLongClickListener(this);
        
        mTextView = (TextView) findViewById(R.id.textView);
    }
    
    @Override
    public boolean onLongClick(View v) {
        if (v.getId() == R.id.longClickButton) {
            String string = String.format("%s: 你长按了按键:%s",
                    Utils.getNowTimeMs(), ((Button) v).getText());
            mTextView.setText(string);
            return true;
        }
        return false;
    }
}

三、Button的禁用与恢复

在实际业务中,按钮通常拥有两种状态,即不可用状态与可用状态,它们在外观和功能上的区别如下:

(1)不可用按钮:按钮不允许点击,即使点击也没反应,同时按钮变为灰色;

(2)可用按钮:按钮允许点击,点击按钮会触发点击事件;

可以通过xml的android:enabled属性和Java Button控件的setEnabled方法控制。

  1. xml:android:enabled属性值为true时表示允许点击,为false时表示不允许点击。

<Button
    android:id="@+id/button_test"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="5dp"
    android:enabled="false"
    android:text="测试按键" />
  1. Java:Button控件的setEnabled()方法控制


public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private Button mButtonEnable, mButtonDisable, mButtonTest;
    private TextView mTextViewForTest;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.i(TAG, "onCreate: " + Utils.getNowDateTime());
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 启用、禁用测试
        mButtonEnable = (Button) findViewById(R.id.button_enable);
        mButtonDisable = (Button) findViewById(R.id.button_disable);
        mButtonTest = (Button) findViewById(R.id.button_test);
        mButtonEnable.setOnClickListener(this);
        mButtonDisable.setOnClickListener(this);
        mButtonTest.setOnClickListener(this);
        mTextViewForTest = (TextView) findViewById(R.id.textViewForTest);
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.button_enable) {
            String string = String.format("%s: 你点击了按键:%s, 请观察【测试按键】的状态",
                    Utils.getNowTimeMs(), ((Button) v).getText());
            mTextViewForTest.setText(string);
            mButtonTest.setEnabled(true);
        } else if (v.getId() == R.id.button_disable) {
            String string = String.format("%s: 你点击了按键:%s, 请观察【测试按键】的状态",
                    Utils.getNowTimeMs(), ((Button) v).getText());
            mTextViewForTest.setText(string);
            mButtonTest.setEnabled(false);
        } else if (v.getId() == R.id.button_test) {
            String string = String.format("%s: 你点击了按键:%s",
                    Utils.getNowTimeMs(), ((Button) v).getText());
            mTextViewForTest.setText(string);
        }
    }
}

四、Button控件测试程序

java:

MainActivity.java


package com.example.buttontest;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements View.OnClickListener, View.OnLongClickListener {
    private final static String TAG = "lzl-test-Button";

    private TextView mTextView;
    private Button mButton1, mButton2, mButton3;
    private int mButton3onClickCount = 0;

    private Button mLongClickButton1, mLongClickButton2, mLongClickButton3;
    private TextView mTextViewForLongClick;

    private Button mButtonEnable, mButtonDisable, mButtonTest;
    private TextView mTextViewForTest;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.i(TAG, "onCreate: " + Utils.getNowDateTime());
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTextView = (TextView) findViewById(R.id.textView);

        mButton1 = (Button) findViewById(R.id.button1);
        mButton1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String string = String.format("%s: 你点击了按键:%s",
                        Utils.getNowTimeMs(), ((Button) v).getText());
                mTextView.setText(string);
            }
        });

        mButton2 = (Button) findViewById(R.id.button2);
        mButton2.setOnClickListener(new MyOnClickListener());

        mButton3 = (Button) findViewById(R.id.button3);
        mButton3.setOnClickListener(this);
        mButton3.setAllCaps(false);

        // 长按
        mLongClickButton1 = (Button) findViewById(R.id.longClickButton1);
        mLongClickButton2 = (Button) findViewById(R.id.longClickButton2);
        mLongClickButton3 = (Button) findViewById(R.id.longClickButton3);
        mLongClickButton1.setOnLongClickListener(this);
        mLongClickButton2.setOnLongClickListener(this);
        mLongClickButton3.setOnLongClickListener(this);
        mTextViewForLongClick = (TextView) findViewById(R.id.textViewForLongClick);

        // 启用、禁用测试
        mButtonEnable = (Button) findViewById(R.id.button_enable);
        mButtonDisable = (Button) findViewById(R.id.button_disable);
        mButtonTest = (Button) findViewById(R.id.button_test);
        mButtonEnable.setOnClickListener(this);
        mButtonDisable.setOnClickListener(this);
        mButtonTest.setOnClickListener(this);
        mTextViewForTest = (TextView) findViewById(R.id.textViewForTest);
    }

    @Override
    public boolean onLongClick(View v) {
        if (v.getId() == R.id.longClickButton1 || v.getId() == R.id.longClickButton2 || v.getId() == R.id.longClickButton3) {
            String string = String.format("%s: 你长按了按键:%s",
                    Utils.getNowTimeMs(), ((Button) v).getText());
            mTextViewForLongClick.setText(string);
            return true;
        }
        return false;
    }

    class MyOnClickListener implements View.OnClickListener {
        @Override
        public void onClick(View v) {
            String string = String.format("%s: 你点击了按键:%s",
                    Utils.getNowTimeMs(), ((Button) v).getText());
            mTextView.setText(string);
        }
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.button3) {
            boolean isAllCaps = (boolean) ((++mButton3onClickCount) % 2 == 1);
            String string = String.format("%s: 你点击了按键:%s",
                    Utils.getNowTimeMs(), ((Button) v).getText());
            mTextView.setText(string);
            mButton3.setAllCaps(isAllCaps);
        } else if (v.getId() == R.id.button_enable) {
            String string = String.format("%s: 你点击了按键:%s, 请观察【测试按键】的状态",
                    Utils.getNowTimeMs(), ((Button) v).getText());
            mTextViewForTest.setText(string);
            mButtonTest.setEnabled(true);
        } else if (v.getId() == R.id.button_disable) {
            String string = String.format("%s: 你点击了按键:%s, 请观察【测试按键】的状态",
                    Utils.getNowTimeMs(), ((Button) v).getText());
            mTextViewForTest.setText(string);
            mButtonTest.setEnabled(false);
        } else if (v.getId() == R.id.button_test) {
            String string = String.format("%s: 你点击了按键:%s",
                    Utils.getNowTimeMs(), ((Button) v).getText());
            mTextViewForTest.setText(string);
        }
    }
}

Utils.java


package com.example.buttontest;

import android.content.Context;

import java.text.SimpleDateFormat;
import java.util.Date;

public class Utils {
    // 根据手机的分辨率从 dp 的单位 转成为 px(像素)
    public static int dp2px(Context context, float dp) {
        // 获取当前手机的像素密度(1个dp对应几个px)
        float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dp * scale + 0.5f); // 四舍五入取整
    }

    // 根据手机的分辨率从 px(像素) 的单位 转成为 dp
    public static int px2dp(Context context, float px) {
        // 获取当前手机的像素密度(1个dp对应几个px)
        float scale = context.getResources().getDisplayMetrics().density;
        return (int) (px / scale + 0.5f); // 四舍五入取整
    }

    // 获取当前的日期时间
    public static String getNowDateTime() {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return simpleDateFormat.format(new Date());
    }

    // 获取当前的时间
    public static String getNowTime() {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");
        return simpleDateFormat.format(new Date());
    }

    // 获取当前的时间(毫秒ms)
    public static String getNowTimeMs() {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss:SSS");
        return simpleDateFormat.format(new Date());
    }
}

xml:

activity_main.xml layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <Button
                android:id="@+id/button1"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_margin="5dp"
                android:layout_weight="1"
                android:text="Button1" />

            <Button
                android:id="@+id/button2"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_margin="5dp"
                android:layout_weight="1"
                android:textAllCaps="false"
                android:text="Button2" />

            <Button
                android:id="@+id/button3"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_margin="5dp"
                android:layout_weight="1"
                android:text="Button3" />
        </LinearLayout>

        <TextView
            android:id="@+id/textView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="显示按键结果" />

    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:orientation="vertical">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <Button
                android:id="@+id/longClickButton1"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_margin="5dp"
                android:layout_weight="1"
                android:textAllCaps="false"
                android:text="长按Button1" />

            <Button
                android:id="@+id/longClickButton2"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_margin="5dp"
                android:layout_weight="1"
                android:textAllCaps="false"
                android:text="长按Button2" />

            <Button
                android:id="@+id/longClickButton3"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_margin="5dp"
                android:layout_weight="1"
                android:textAllCaps="false"
                android:text="长按Button3" />
        </LinearLayout>

        <TextView
            android:id="@+id/textViewForLongClick"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="显示长按键结果" />
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:gravity="center"
        android:orientation="vertical">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <Button
                android:id="@+id/button_enable"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_margin="5dp"
                android:layout_weight="1"
                android:text="启用【测试按键】" />

            <Button
                android:id="@+id/button_disable"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_margin="5dp"
                android:layout_weight="1"
                android:text="禁用【测试按键】" />
        </LinearLayout>

        <Button
            android:id="@+id/button_test"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:enabled="false"
            android:text="测试按键" />

        <TextView
            android:id="@+id/textViewForTest"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="显示按键结果" />
    </LinearLayout>
</LinearLayout>

模拟器运行

图(2)

源码及测试apk

百度网盘链接:百度网盘 请输入提取码 提取码:test

github下载地址:

GitHub - liuzhengliang1102/AndroidStudio-LearnAppDevelopment

点此查看Android应用开发学习笔记的完整目录

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐