Android应用开发(7)按键(Button)
本章介绍按钮(Button)控件的常见用法,结合前面Android应用开发(5)文本显示(TextView)介绍按钮(Button)监听点击和长按事件,禁用和启用等。
参考google官网:https://developer.android.com/reference/android/widget/Button
一、按键(Button)介绍
按钮控件Button由TextView派生而来,所以TextView拥有的属性和方法,Button均能使用,如上一章Android应用开发(5)文本显示(TextView)设置文本内容、文本大小、显示颜色,按钮(Button)控件均可使用。它们之间的区别有:
- Button拥有默认的按钮背景,而TextView默认无背景;
- Button的内部文本默认居中对齐,而TextView的内部文本默认靠左对齐;
- Button会默认将英文字母转为大写,而TextView保持原始的英文大小写;
与TextView相比,Button增加了两个新属性:
- textAllCaps属性,它指定了是否将英文字母转为大写,为true是表示自动转为大写,为false表示不做大写转换。
- 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毫秒时,会触发长按事件。
-
设置点击事件监听
如果一个页面只有一个按键,可以通过下面方法为这一个按键定义监听器,并设置邦定监监听器
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);
}
}
}
-
设置长按事件监听
按键按住超过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方法控制。
-
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="测试按键" />
-
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
更多推荐
所有评论(0)