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

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也是很吃力的,后来买了本书,也看了些老师的视频教学,多练习之后,明显有所进步,然后发现封装真的很厉害,它很有利于同事工作之间的代码协调,规定好具体封装形式,干净整洁,也不容易暴露核心技术,舒服。

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值