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"><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控件的基本使用(初识封装、减少代码冗余性、代码优化)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 返回数据给上一个活动
- 下一篇: EditText控件的基本使用(点击Bu