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"><Buttonandroid:id="@+id/btn1"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="abcDEfg"android:textAllCaps="true"android:visibility="visible" /><Buttonandroid: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;@Overrideprotected 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);}@Overridepublic 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);}@Overridepublic 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() {@Overridepublic void onClick(View v) {}});
new View.OnClickListener() {@Overridepublic void onClick(View v) {}
}      这就是OnClickListener接口的匿名实现类对象,将这个整体,作为参数传入setOnCliskListener()方法中就可以实现点击监听了。在onClick(View v){} 中可以写你需要做的逻辑代码。例如下面的代码:
 btn1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {btn1.setText("textAllCaps=true  英文字母全大写"+"\n visibility=visible 控件可见" );}});btn2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {btn2.setText("textAllCaps=false 英文字母根据内容来显示"+"\n visibility=visible 控件可见");}});

最后,不知道有没有同学发现一个问题,在点击监听中直接将文字设置到Button控件上,这种做法其实很不好,因为如果文字过多,或者我们在获取文字的过程中过于复杂,很耗时的话,就会出现问题。在Android中,主线程是不能进行耗时操作的,我们一般会把一些耗时的操作,单独放入一个子线程中,让子线程来操作,Android中刚好有一个专门用来在主线程中跟新UI的子线程。

runOnUiThread(new Runnable() {@Overridepublic void run() {}});

然后我们将耗时操作放入run()方法中就好了,代码如下:

方法1:

 @Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btn1:runOnUiThread(new Runnable() {@Overridepublic void run() {btn1.setText("textAllCaps=true  英文字母全大写"+"\n visibility=visible 控件可见" );                        }});break;case R.id.btn2:runOnUiThread(new Runnable() {@Overridepublic void run() {btn2.setText("textAllCaps=false 英文字母根据内容来显示"+"\n visibility=visible 控件可见");         }});break;default:break;}}

方法2:

btn1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {runOnUiThread(new Runnable() {@Overridepublic void run() {btn1.setText("textAllCaps=true  英文字母全大写"+"\n visibility=visible 控件可见" );}});}});btn2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {runOnUiThread(new Runnable() {@Overridepublic void run() {btn2.setText("textAllCaps=false 英文字母根据内容来显示"+"\n visibility=visible 控件可见");}});}});

回顾前面的代码,有没有发现,重复的代码有点多?

这里为了减少代码的冗余性,我们可以为这些多次使用的重复代码加以封装和优化,就用两个函数封装一下,然后调用就好了。

实现1:

    @Overridepublic 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() {@Overridepublic 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() {@Overridepublic void run() {if (btn == btn1) {btn1.setText(str);}if (btn == btn2) {btn2.setText(str);}}});}btn1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {function1();//更新btn1的显示内容}});btn2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {function2();//更新btn2的显示内容}});

如果新同学看不太明白封装,可以买本java基础,认真学习一下java基础,等你java有了基础之后,学习Android就会比较轻松了。记得我1年前学习Android也是很吃力的,后来买了本书,也看了些老师的视频教学,多练习之后,明显有所进步,然后发现封装真的很厉害,它很有利于同事工作之间的代码协调,规定好具体封装形式,干净整洁,也不容易暴露核心技术,舒服。

Button控件的基本使用(初识封装、减少代码冗余性、代码优化)相关推荐

  1. 通过最简单的button控件,深入学习SAP UI5框架代码系列之零

    Jerry曾经作为SAP成都研究院的Fiori应用开发人员,从事了将近3年的SAP CRM Fiori应用开发,在使用SAP UI5的过程中,遇到过形形色色的问题,不少都是通过调试SAP UI5框架代 ...

  2. ASP.NET Button控件的UseSubmitBehavior属性引发的血案

    这里先不说标题上的UseSubmitBehavior属性是什么,先说下面这种情况. 通常,在我们写一个表单页面的时候,最下方会有"提交"和"返回"字样的两个按钮 ...

  3. 【第3版emWin教程】第55章 emWin6.x按钮Button控件自定义回调函数,实现各种按钮效果

    教程不断更新中:链接 第55章       emWin6.x按钮Button控件自定义回调函数,实现各种按钮效果 本章节为大家讲解按钮控件自定义回调函数,通过其回调函数就可以实现各种按钮效果.这方面的 ...

  4. Android UI 统一修改Button控件的样式,以及其它系统控件的默认样式

    先介绍下修改原理:首先打开位于android.widget包下面的Button.java文件,这里有一句关键的代码如下: public Button(Context context, Attribut ...

  5. 设置Button控件创建完毕时触发的事件.

    Button控件的creationCompleteEffect样式. 示例: 刷新查看效果. 代码: <?xml version="1.0" encoding="u ...

  6. [视频]Silverlight for Windows Phone 7基本开发过程以及Push Button控件的使用

    简介 通过视频的方式讲述Silverlight for Windows Phone 7基本开发过程以及Push Button控件的使用,同时讲述Silverlight for Windows Phon ...

  7. python第三方库tkinter之Label控件和Button控件

    from tkinter import * window =Tk() window.title("dalaijun")#窗口标题 window["background&q ...

  8. Windows Phone 7 button控件

    System.Windows.Controls.Button   button控件 一.button控件的各种样式的展示 可以通过 <phone:PhoneApplicationPage.Res ...

  9. Android Button控件字母大小写显示问题

    之前做开发时候,Button控件中的文字一般是中文,昨天做测试时候设置成英文后发现不管如何设置,手机上都显示是大写字母(其他控件没有). btn.setText("aaa"); / ...

最新文章

  1. 算法----- 给定一颗二叉树,找到二叉树上任意两个节点之间的距离(Java版本)
  2. BOOST_LOG_UNIQUE_IDENTIFIER_NAME宏用法的测试程序
  3. CNCF TOC 委员张磊:不断演进的云原生给我们带来了什么?
  4. Android 4.4 KitKat, the browser and the Chrome WebView
  5. c语言循环链表中设立尾链表,C语言实现双向非循环链表(带头结点尾结点)的节点插入...
  6. 日志长度_Kafka 日志存储详解
  7. 大数据学习笔记24:利用MR改造Zebra项目
  8. 单片机单口不可用或被占用_昆明工业控制单片机应用开发价格
  9. python职位应该叫什么_从事什么职位的人适合学习Python​?
  10. Eclipse .class文件中文乱码
  11. 概率论中的公式解释(个人理解,非官方)- No1
  12. wifi连接过程抓包
  13. 反编译DLL。并且修改DLL内容
  14. JPG png GIF BMP常见图像格式的介绍与区别
  15. 《工业设计史》第七章:艺术变革与现代设计
  16. c语言中d的作用是什么,在C语言中c% 和 d% 是表示什么意思?
  17. 教师计算机西沃培训心得,学习使用希沃电子白板的心得体会
  18. 通过无线网络实现两台计算机共享打印机共享,教你两招实现无线网络共享打印机...
  19. 常见的登录逻辑漏洞总结
  20. hxy系列5-反向传播

热门文章

  1. 好好学python·集合
  2. css知多少(1)——我来问你来答(转)
  3. TDD Tip:方法内部New出来的对象如何Mock
  4. SharePoint Designer 2013 Workflow
  5. 实用小命令-windows下查看端口占用情况
  6. 谷歌杀手Wolfram Alpha搜索引擎上线测试
  7. 绘制网络拓扑图的素材
  8. OCH\OMS\OTS\MSP\RS\SPI解释
  9. PAT甲级1065 A+B and C (64bit):[C++题解]爆long long,熟悉计算机存储有符号数原理
  10. 汤家凤高等数学基础手写笔记-重积分