Android应用开发(7)按键(Button)

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应用开发学习笔记的完整目录

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 要快速入门Android应用开发,首先需要掌握以下几个方面: 1. Java基础知识:Android应用开发使用Java语言编写,所以需要先学习Java基础知识,包括数据类型、变量、运算符、控制语句等。 2. Android开发环境:下载并安装Android Studio集成开发环境,安装好后可以创建Android项目并进行开发。学习使用Android Studio的各种功能和设置。 3. Android应用架构:了解Android应用的架构,包括Activity、Service、Broadcast Receiver和Content Provider四大组件,了解它们的作用和使用方法。 4. Android界面设计:Android应用的界面设计需要使用XML布局文件编写,学习使用Android Studio自带的布局设计工具和相关属性,能够实现简单的界面设计。 5. Android应用开发流程:学习了解Android应用的开发流程,包括界面设计、数据处理、写入和读取数据、调试和测试等。 6. Android应用调试与测试:掌握Android应用的调试和测试方法,包括使用模拟器和真机测试、使用logcat查看日志等。 除此之外,还可以参与一些在线课程或社区,多看文档和视频,不断练习和尝试。在开发过程中也要学会团队协作,积极参与开源社区,分享经验和技巧,不断交流和学习。让自己的开发技能更进一步。 ### 回答2: Android应用开发是一个非常有趣的领域,越来越多的人开始学习并进行开发。那么如何快速入门android应用开发呢? 1. 学习Java语言基础知识:Android应用是基于Java语言开发的,掌握Java语言基础是快速入门Android应用开发的关键。 2. 下载并掌握Android Studio:这是一款专门用于Android应用开发的IDE,它提供丰富的工具和资源帮助开发者进行开发。 3. 学习Android应用组件:Android应用由多个组件构成,如Activity、Service、Broadcast Receiver和Content Provider等,学习这些组件并掌握它们的作用是快速入门Android应用开发的另一关键。 4. 掌握布局和UI设计:Android应用的界面设计非常重要,你需要掌握常用的布局和UI设计元素,如TextView、EditText、Button、ImageView并了解它们的属性和使用场景。 5. 学习SQLite数据库操作:Android应用通常需要访问和管理数据,SQLite是Android系统默认的轻量级数据库,学习如何使用它可以快速入门Android应用开发。 6. 初步了解网络编程:现代Android应用通常需要访问网络接口获取数据或实现即时通信,初步了解网络编程是快速入门Android应用开发的另一关键。 7. 动手实践和不断重构:最后,为了快速入门Android应用开发,动手实践非常重要。通过实践来加深对知识点的理解和掌握,同时不断重构代码来提升代码的质量和效率。 通过以上方法,你可以快速入门Android应用开发并开始开发自己的应用。记住,学习需要时间和耐心,不要怕失败,最重要的是一定要坚持下去! ### 回答3: 要快速入门Android应用开发,您需要掌握以下几个方面: 1. 学习Java编程语言。Android应用程序是使用Java语言编写的,因此了解其语法和概念非常重要。 2. 安装Android Studio并学习使用它。Android Studio是开发Android应用所必需的IDE。 3. 学习Android基础知识。了解Android应用程序的主要组件,例如活动(Activity)、服务(Service)、广播接收器(Broadcast Receiver)和内容提供程序(Content Provider),能够为您的应用程序的构建打下坚实的基础。 4. 学习XML布局。应用程序的用户界面是使用XML布局文件构建的,因此对XML语言和布局文件的了解也很重要。 5. 学习如何使用Android SDK编写代码。 Android提供了丰富的API以及相关的库来支持Android应用程序的开发,了解如何使用这些API和库并将其应用到您的应用程序中非常重要。 6. 了解如何测试您的应用程序。您可以使用Android Studio帮助您测试应用程序。 总之,快速入门Android应用程序开发需要大量学习和实践。了解Java编程语言、Android基础知识、XML布局和Android SDK,以及如何测试您的应用程序是非常重要的。还需多多实践和不断学习。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liuzl_2010

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值