Button是程序用于和用户进行交互的一个重要控件,它的配置属性和TextView差不多,这里我们可以注意观察一下Button众多属性中的两种:
1.属性名android:textAllCaps (用于设置Button控件中的英文字母大小写)
2.属性名android:visibility (用于设置Button控件是否可见,以及不可见的时候是否占据屏幕空间)
下面我们具体看下这两个属性的具体值的功能:
1.android:textAllCaps="true"
这个是系统默认的值,将英文字母全部默认大写显示 例:android:text="abcDEfg" 显示:ABCDEF
android:textAllCaps="false"
当我们将值设置为false之后,英文字母都按照你所获取的文本内容来显示.例:androidtext="AbCDefg" 显示:AbCDefg
2.android:visibility="gone" 将Button控件设置为不可见,并且不占据屏幕空间
android:visibility="invisible" 将Button控件设置为不可见,但占据屏幕空间
android:visibility="visible" 将Button控件设置为可见,占据屏幕空间
接下来就是Button控件的点击监听了:
在使用Button控件之前,首先你得在相应Activity的布局文件中来定义Button控件,这里我就定义两个Button控件吧,顺便将上面两个属性给使用一下。
activity_main.xml中:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/btn1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="abcDEfg"
android:textAllCaps="true"
android:visibility="visible" />
<Button
android:id="@+id/btn2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="AbCDefg"
android:textAllCaps="false"
android:visibility="visible" />
</LinearLayout>
MainActivity.java中:
package com.example.administrator.activitydemo;
import android.content.Intent;
import android.net.Uri;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button btn1, btn2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();//初始化UI控件
}
private void initView() {
btn1 = (Button) findViewById(R.id.btn1);
btn2 = (Button) findViewById(R.id.btn2);
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn1:
btn1.setText("textAllCaps=true 英文字母全大写"+"\n visibility=visible 控件可见" );
break;
case R.id.btn2:
btn2.setText("textAllCaps=false 英文字母根据内容来显示"+"\n visibility=visible 控件可见");
break;
default:
break;
}
}
}
运行效果:
点击btn1、btn2:
接下来我来将MainActivity.java中的代码分析一下,
1.首先在最上方我们声名了两个Button类型的变量 btn1,btn2
2.在重写的onCreate()方法中定义了一个initView()方法,这个方法专门用来初始化UI控件的,因为只有初始化好了控件,我们才能为其设置点击监听,要么就会出现java.lang.NullPointException(空指针异常),至于为何我们要在onCreate()方法中初始化UI控件呢,这是因为根据Activity的生命周期,onCreate()方法是Activity被创建的时候,系统自动调用的方法,我们在这里初始化UI控件意思就是在Activity一旦被创建后,就可以使用UI控件了。
3.在initView()方法中初始化完UI控件后,就调用Button类中的setOnClickListener(OnClickListener listener)方法,这里的参数是个引用类型(类、接口、数组),这里的OnClickListener是个接口,所以我们需要传入一个OnClickListener接口的实现类的对象,一般有两种写法:
第一种是btn1.setOnClickListener(this); 这里的this就是MainActivity类的引用
用MainActivity类去实现View类中的OnClickListener接口
public class MainActivity extends AppCompatActivity implements View.OnClickListener
然后重写onClick(View v)方法,这里一般搭配switch case语句,根据所点击Button控件的id来判断是点击的哪个Button
private void initView() {
btn1 = (Button) findViewById(R.id.btn1);
btn2 = (Button) findViewById(R.id.btn2);
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn1:
btn1.setText("textAllCaps=true 英文字母全大写"+"\n visibility=visible 控件可见" );
break;
case R.id.btn2:
btn2.setText("textAllCaps=false 英文字母根据内容来显示"+"\n visibility=visible 控件可见");
break;
default:
break;
}
}
第二种是直接传入一个匿名的接口实现类对象
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
new View.OnClickListener() {
@Override
public void onClick(View v) {
}
} 这就是OnClickListener接口的匿名实现类对象,将这个整体,作为参数传入setOnCliskListener()方法中就可以实现点击监听了。在onClick(View v){} 中可以写你需要做的逻辑代码。例如下面的代码:
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
btn1.setText("textAllCaps=true 英文字母全大写"+"\n visibility=visible 控件可见" );
}
});
btn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
btn2.setText("textAllCaps=false 英文字母根据内容来显示"+"\n visibility=visible 控件可见");
}
});
最后,不知道有没有同学发现一个问题,在点击监听中直接将文字设置到Button控件上,这种做法其实很不好,因为如果文字过多,或者我们在获取文字的过程中过于复杂,很耗时的话,就会出现问题。在Android中,主线程是不能进行耗时操作的,我们一般会把一些耗时的操作,单独放入一个子线程中,让子线程来操作,Android中刚好有一个专门用来在主线程中跟新UI的子线程。
runOnUiThread(new Runnable() {
@Override
public void run() {
}
});
然后我们将耗时操作放入run()方法中就好了,代码如下:
方法1:
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn1:
runOnUiThread(new Runnable() {
@Override
public void run() {
btn1.setText("textAllCaps=true 英文字母全大写"+"\n visibility=visible 控件可见" );
}
});
break;
case R.id.btn2:
runOnUiThread(new Runnable() {
@Override
public void run() {
btn2.setText("textAllCaps=false 英文字母根据内容来显示"+"\n visibility=visible 控件可见");
}
});
break;
default:
break;
}
}
方法2:
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
runOnUiThread(new Runnable() {
@Override
public void run() {
btn1.setText("textAllCaps=true 英文字母全大写"+"\n visibility=visible 控件可见" );
}
});
}
});
btn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
runOnUiThread(new Runnable() {
@Override
public void run() {
btn2.setText("textAllCaps=false 英文字母根据内容来显示"+"\n visibility=visible 控件可见");
}
});
}
});
回顾前面的代码,有没有发现,重复的代码有点多?
这里为了减少代码的冗余性,我们可以为这些多次使用的重复代码加以封装和优化,就用两个函数封装一下,然后调用就好了。
实现1:
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn1:
function1();//更新btn1的显示内容
break;
case R.id.btn2:
function2();//更新btn2的显示内容
break;
default:
break;
}
}
public void function1() {
updateUI(btn1, "textAllCaps=true 英文字母全大写" + "\n visibility=visible 控件可见");
}
public void function2() {
updateUI(btn2, "textAllCaps=false 英文字母根据内容来显示\"+\"\\n visibility=visible 控件可见");
}
public void updateUI(final Button btn, final String str) {
runOnUiThread(new Runnable() {
@Override
public void run() {
if (btn == btn1) {
btn1.setText(str);
}
if (btn == btn2) {
btn2.setText(str);
}
}
});
}
实现2:
public void function1() {
updateUI(btn1, "textAllCaps=true 英文字母全大写" + "\n visibility=visible 控件可见");
}
public void function2() {
updateUI(btn2, "textAllCaps=false 英文字母根据内容来显示\"+\"\\n visibility=visible 控件可见");
}
public void updateUI(final Button btn, final String str) {
runOnUiThread(new Runnable() {
@Override
public void run() {
if (btn == btn1) {
btn1.setText(str);
}
if (btn == btn2) {
btn2.setText(str);
}
}
});
}
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
function1();//更新btn1的显示内容
}
});
btn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
function2();//更新btn2的显示内容
}
});
如果新同学看不太明白封装,可以买本java基础,认真学习一下java基础,等你java有了基础之后,学习Android就会比较轻松了。记得我1年前学习Android也是很吃力的,后来买了本书,也看了些老师的视频教学,多练习之后,明显有所进步,然后发现封装真的很厉害,它很有利于同事工作之间的代码协调,规定好具体封装形式,干净整洁,也不容易暴露核心技术,舒服。