第五章 用戶界面基礎(chǔ)(Button)

參考資料:
《Android應(yīng)用程序開發(fā)》ISBN 9787302283164
參考軟件:
Android Studio、Eclipse+ADT、Android SDK、JDK
用戶界面基礎(chǔ)(接上節(jié)內(nèi)容)
三、Button
常見屬性
? ?setAutoLinkMask(int)控制鏈接網(wǎng)址和電子郵件地址等是否自動(dòng)發(fā)現(xiàn)并轉(zhuǎn)換為可點(diǎn)擊的鏈接。
?setKeyListener(KeyListener)如果設(shè)置,指定該TextView文本輸入法和自動(dòng)糾正一些常見的拼寫錯(cuò)誤
?setText(CharSequence?TextView.BufferType)確定最低類型getText()將返回。
?setKeyListener(KeyListener)如果設(shè)置,指定該TextView文本輸入法,應(yīng)該自動(dòng)利用用戶類型。
?setCursorVisible(布爾)使得光標(biāo)(默認(rèn))可見或不可見。
android:數(shù)字setKeyListener(KeyListener)如果設(shè)置,指定該TextView數(shù)字輸入法,這些特定的字符,它將接受的。
?setCompoundDrawablesWithIntrinsicBounds(int,int,int,int)可拉的得出以下文本。
?setCompoundDrawablesWithIntrinsicBounds(int,int,int,int)繪制的是左邊的文本。
?setCompoundDrawablePadding(int)之間的填充畫板和文本。
?setCompoundDrawablesWithIntrinsicBounds(int,int,int,int)繪制的是右邊的文本。
?setCompoundDrawablesWithIntrinsicBounds(int,int,int,int)上面的得出可拉的文本。
android:可編輯如果設(shè)置,指定該TextView輸入法。
?setInputExtras(int)引用一個(gè)<?input-extras?>?XML資源包含額外的數(shù)據(jù)提供一個(gè)輸入方法,這是私人的實(shí)現(xiàn)輸入法。
?setEllipsize(TextUtils.TruncateAt)如果設(shè)置,導(dǎo)致單詞以上的觀點(diǎn)是碎ellipsized寬,而不是在中間。
?setEms(int)使TextView正是這許多ems寬。
?setFreezesText(布爾)如果設(shè)置文本視圖將包含當(dāng)前完成文本內(nèi)的冷凍冰柱除了元數(shù)據(jù),比如當(dāng)前光標(biāo)位置。
android:重力setGravity(int)指定如何對(duì)齊文本視圖的x和y軸小于文本時(shí)的觀點(diǎn)。android:高度setHeight(int)使TextView正是這許多像素高。
android:提示setHint(int)時(shí)所顯示的提示文本的文本是空的。
android:imeActionId?setImeActionLabel(CharSequence?int)為EditorInfo提供一個(gè)值。?actionId時(shí)使用一個(gè)輸入連接到文本視圖方法。
android:imeActionLabel?setImeActionLabel(CharSequence?int)為EditorInfo提供一個(gè)值。?actionLabel時(shí)使用一個(gè)輸入連接到文本視圖方法。
android:imeOptions?setImeOptions(int)附加功能您可以啟用一個(gè)輸入法與一個(gè)編輯器來(lái)提高與應(yīng)用程序的集成。
android:includeFontPadding?setIncludeFontPadding(布爾)留下足夠的字體就是和流暢的空間而不是使用嚴(yán)格字體上升和下降。
android:inputMethod?setKeyListener(KeyListener)如果設(shè)置,指定該TextView應(yīng)該使用指定的輸入方法(指定完全限定類名)。
android:inputType?setRawInputType(int)被放置在一個(gè)文本字段的數(shù)據(jù)類型,用來(lái)幫助一個(gè)輸入法決定如何讓用戶輸入文本。
android:lineSpacingExtra?setLineSpacing(浮子,浮子)額外間距行文本。
android:lineSpacingMultiplier?setLineSpacing(浮子,浮子)額外間距行文本,乘數(shù)效應(yīng)。
android:行setLines(int)使TextView正是這許多行高。
android:linksClickable?setLinksClickable(布爾)如果設(shè)置為false,阻礙運(yùn)動(dòng)方法將運(yùn)動(dòng)的聯(lián)系方法即使autoLink原因被發(fā)現(xiàn)的鏈接。
android:marqueeRepeatLimit?setMarqueeRepeatLimit(int)字幕動(dòng)畫重復(fù)的次數(shù)。
android:maxEms?setMaxEms(int)使TextView最多這許多ems寬。
android:maxHeight?setMaxHeight(int)使TextView最多這許多像素高。
android:最大長(zhǎng)度setFilters(InputFilter)設(shè)置一個(gè)過(guò)濾器來(lái)限制輸入的文本長(zhǎng)度到指定的號(hào)碼。
android:maxLines?setMaxLines最多(int)使TextView被這麼多行高。
android:maxWidth?setMaxWidth最多(int)使TextView被這麼多像素寬。
android:minEms?setMinEms(int)使TextView至少這許多ems寬。
android:minHeight?setMinHeight(int)使TextView至少這許多像素高。
android:minLines?setMinLines(int)使TextView至少這許多行高。
android:minWidth?setMinWidth(int)使TextView至少這許多像素寬。
android:數(shù)字setKeyListener(KeyListener)如果設(shè)置,指定該TextView數(shù)字輸入法。
android:密碼setTransformationMethod(TransformationMethod)字段的字符是否顯示為密碼點(diǎn),而不是自己。
android:phoneNumber?setKeyListener(KeyListener)如果設(shè)置,指定該TextView有電話號(hào)碼的輸入方法。
android:privateImeOptions?setPrivateImeOptions(String)添加內(nèi)容類型描述提供輸入方法在文本視圖,這是私人的實(shí)現(xiàn)輸入法。
android:scrollHorizontally?setHorizontallyScrolling(布爾)文本是否允許更廣泛的比視圖(因此可以水平滾動(dòng))。
android:selectAllOnFocus?setSelectAllOnFocus(布爾)如果文本是可選擇的,選擇它當(dāng)視圖所需要的關(guān)注,而不是將光標(biāo)移動(dòng)到開始或結(jié)束。
android:shadowColor?setShadowLayer(浮子,浮子,浮子,int)放置一個(gè)指定顏色的陰影背后的文本。
android:shadowDx?setShadowLayer(浮動(dòng),浮動(dòng),浮動(dòng),int)水平偏移的影子。
android:shadowDy?setShadowLayer(浮子,浮子,浮子,int)垂直偏移量的影子。
android:shadowRadius?setShadowLayer(浮子,浮子,浮子,int)半徑的影子。
android:單行模式setTransformationMethod(TransformationMethod)限制了文本一行水平滾動(dòng),而不是讓它包裝到多個(gè)行,并提出重點(diǎn)而不是按enter鍵時(shí)插入一個(gè)新行。
android:文本setText(CharSequence?TextView.BufferType)文本顯示。
android:textAppearance基本文本顏色,字體,大小和風(fēng)格。
android:textColor?setTextColor(int)文本顏色。
android:textColorHighlight?setHighlightColor(int)的顏色選擇突出顯示的文本。
android:textColorHint?setHintTextColor(int)提示文本的顏色。
android:textColorLink?setLinkTextColor(int)鏈接的文本顏色。
android:textIsSelectable?isTextSelectable()表明的內(nèi)容不可編輯的文本可以選擇。
android:textScaleX?setTextScaleX(浮動(dòng))設(shè)置文本的水平擴(kuò)展因素。
android:textSize?setTextSize(int,浮動(dòng))大小的文本。
android:textStyle?setTypeface(字體)風(fēng)格(粗體、斜體、bolditalic)文本。
android:字體setTypeface(字體)字體(正常、無(wú)襯線、等寬字體)的文本。
android:寬度setWidth(int)使TextView正是這許多像素寬。
常用代碼
1、Android按鈕單擊事件的四種常用寫法
很多學(xué)習(xí)Android程序設(shè)計(jì)的人都會(huì)發(fā)現(xiàn)每個(gè)人對(duì)代碼的寫法都有不同的偏好,比較明顯的就是對(duì)控件響應(yīng)事件的寫法的不同。因此本文就把這些寫法總結(jié)一下,比較下各種寫法的優(yōu)劣,希望對(duì)大家靈活地選擇編碼方式可以有一定的參考借鑒價(jià)值。
xml文件代碼如下:
<Button
? ? android:id="@+id/button1"
? ? android:layout_width="wrap_content"
? ? android:layout_height="wrap_content"
? ? android:text="Button1" />
? <Button
? ? android:id="@+id/button2"
? ? android:layout_width="wrap_content"
? ? android:layout_height="wrap_content"
? ? android:text="Button2" />
四種方法分述如下:
匿名內(nèi)部類:
public class TestButtonActivity extends Activity {
? Button btn1, btn2;
? Toast tst;
? @Override
? protected void onCreate(Bundle savedInstanceState) {
? ? super.onCreate(savedInstanceState);
? ? setContentView(R.layout.activity_test_button);
? ? btn1 = (Button) findViewById(R.id.button1);
? ? btn2 = (Button) findViewById(R.id.button2);
? ? btn1.setOnClickListener(new OnClickListener() {
? ? ? @Override
? ? ? public void onClick(View v) {
? ? ? ? // TODO Auto-generated method stub
? ? ? ? Toast tst = Toast.makeText(TestButtonActivity.this, "111111111", Toast.LENGTH_SHORT);
? ? ? ? tst.show();
? ? ? }
? ? });
? ? btn2.setOnClickListener(new OnClickListener() {
? ? ? @Override
? ? ? public void onClick(View v) {
? ? ? ? // TODO Auto-generated method stub
? ? ? ? Toast tst = Toast.makeText(TestButtonActivity.this, "222222222", Toast.LENGTH_SHORT);
? ? ? ? tst.show();
? ? ? }
? ? });
? }
}
自定義單擊事件監(jiān)聽類:
public class TestButtonActivity extends Activity {
? Button btn1, btn2;
? Toast tst;
? class MyClickListener implements OnClickListener {
? ? @Override
? ? public void onClick(View v) {
? ? ? // TODO Auto-generated method stub
? ? ? switch (v.getId()) {
? ? ? case R.id.button1:
? ? ? ? tst = Toast.makeText(TestButtonActivity.this, "111111111", Toast.LENGTH_SHORT);
? ? ? ? tst.show();
? ? ? ? break;
? ? ? case R.id.button2:
? ? ? ? tst = Toast.makeText(TestButtonActivity.this, "222222222", Toast.LENGTH_SHORT);
? ? ? ? tst.show();
? ? ? ? break;
? ? ? default:
? ? ? ? break;
? ? ? }
? ? }
? }
? @Override
? protected void onCreate(Bundle savedInstanceState) {
? ? super.onCreate(savedInstanceState);
? ? setContentView(R.layout.activity_test_button);
? ? btn1 = (Button) findViewById(R.id.button1);
? ? btn2 = (Button) findViewById(R.id.button2);
? ? btn1.setOnClickListener(new MyClickListener());
? ? btn2.setOnClickListener(new MyClickListener());
? }
}
Activity繼承View.OnClickListener,由Activity實(shí)現(xiàn)OnClick(View view)方法,在OnClick(View view)方法中用switch-case對(duì)不同id代表的button進(jìn)行相應(yīng)的處理
public class TestButtonActivity extends Activity implements OnClickListener {
? Button btn1, btn2;
? Toast tst;
? @Override
? protected void onCreate(Bundle savedInstanceState) {
? ? super.onCreate(savedInstanceState);
? ? setContentView(R.layout.activity_test_button);
? ? btn1 = (Button) findViewById(R.id.button1);
? ? btn2 = (Button) findViewById(R.id.button2);
? ? btn1.setOnClickListener(this);
? ? btn2.setOnClickListener(this);
? }
? @Override
? public void onClick(View v) {
? ? // TODO Auto-generated method stub
? ? switch (v.getId()) {
? ? case R.id.button1:
? ? ? tst = Toast.makeText(this, "111111111", Toast.LENGTH_SHORT);
? ? ? tst.show();
? ? ? break;
? ? case R.id.button2:
? ? ? tst = Toast.makeText(this, "222222222", Toast.LENGTH_SHORT);
? ? ? tst.show();
? ? ? break;
? ? default:
? ? ? break;
? ? }
? }
}
最后一種是我今天看到的一種寫法,在XML文件中“顯示指定按鈕的onClick屬性,這樣點(diǎn)擊按鈕時(shí)會(huì)利用反射的方式調(diào)用對(duì)應(yīng)Activity中的click()方法”
<Button
? ? android:id="@+id/button1"
? ? android:layout_width="wrap_content"
? ? android:layout_height="wrap_content"
? ? android:onClick="onClick"
? ? android:text="Button1" />
? <Button
? ? android:id="@+id/button2"
? ? android:layout_width="wrap_content"
? ? android:layout_height="wrap_content"
? ? android:onClick="onClick"
? ? android:text="Button2" />
這里在輸完android:的時(shí)候按下 Alt+/ 會(huì)有 onClick 屬性的提示, 但輸入到 android:onClick=“ 的地方按下 Alt+/ 并沒有提示 onClick 選項(xiàng),讓我突然覺得這里好像有點(diǎn)問題。
public class TestButtonActivity extends Activity {
? Button btn1, btn2;
? Toast tst;
? @Override
? protected void onCreate(Bundle savedInstanceState) {
? ? super.onCreate(savedInstanceState);
? ? setContentView(R.layout.activity_test_button);
? }
? // 注意 這里沒有 @Override 標(biāo)簽
? public void onClick(View v) {
? ? // TODO Auto-generated method stub
? ? switch (v.getId()) {
? ? case R.id.button1:
? ? ? tst = Toast.makeText(this, "111111111", Toast.LENGTH_SHORT);
? ? ? tst.show();
? ? ? break;
? ? case R.id.button2:
? ? ? tst = Toast.makeText(this, "222222222", Toast.LENGTH_SHORT);
? ? ? tst.show();
? ? ? break;
? ? default:
? ? ? break;
? ? }
? }
}
這種寫法整個(gè)代碼中都不用聲明button就可以實(shí)現(xiàn)button的單擊事件。
以上就是四種實(shí)現(xiàn)按鈕單擊事件的方法。
粗略總結(jié)一下,就是按鈕少的時(shí)候用匿名內(nèi)部類會(huì)比較快,比如寫demo測(cè)試的時(shí)候或者登陸界面之類的。
按鈕多的情況我還是選擇第三種方法,方便。
關(guān)于第四種方法,我感覺最方便,但看了很多代碼還是覺得寫法不夠大眾化,感興趣的朋友可以對(duì)此研究研究。相信會(huì)有不少收獲。
?2、Android自定義Button按鈕顯示樣式
現(xiàn)在的用戶對(duì)APP的外觀看得很重要,如果APP內(nèi)所有元件都用Android默認(rèn)樣式寫,估計(jì)下面評(píng)論里就有一堆在罵UI丑的。今天學(xué)習(xí)自定義Button按鈕樣式。Button樣式修改的是Button的背景(Background)屬性。
首先寫一個(gè)定義Button樣式的XML文件:
新建Android XML文件,類型選Drawable,根結(jié)點(diǎn)選selector,文件名就buton_style吧。
程序自動(dòng)給我們剛剛建的文件里加了selector結(jié)點(diǎn),我們只需要在selector結(jié)點(diǎn)里寫上三種狀態(tài)時(shí)顯示的背景圖片(按下、獲取焦點(diǎn),正常)。
代碼如下:
Xml代碼?
<?xml version="1.0" encoding="utf-8"?>?
<selector xmlns:android="http://schemas.android.com/apk/res/android">?
??? <item android:state_pressed="true" android:drawable="@drawable/play_press" />?
??? <item android:state_focused="true" android:drawable="@drawable/play_press" />?
??? <item android:drawable="@drawable/play" />?
</selector>??
?
我這里獲取焦點(diǎn)跟點(diǎn)擊時(shí)顯示的是同一張圖片,必須嚴(yán)格照上面的順序?qū)?,不可倒?br/>接下來(lái)只要在布局時(shí)寫B(tài)utton控件時(shí)應(yīng)用到Button的Background屬性即可。
Xml代碼?
<Button android:id="@+id/button1"?
??? android:layout_width="wrap_content" android:layout_height="wrap_content"?
??? android:background="@drawable/button_style"?
></Button>??
?
最終效果圖:
再加上一種自定義樣式方法,上面的是用圖片,其實(shí)我們可以直接通過(guò)定義xml文件來(lái)實(shí)現(xiàn)不同的樣式:
在上面的源代碼基礎(chǔ)上,只需要修改button_style文件,同樣三種狀態(tài)分開定義:
Xml代碼?
<?xml version="1.0" encoding="utf-8"?>?
<selector xmlns:android="http://schemas.android.com/apk/res/android">?
??? <item android:state_pressed="true">?
??????? <shape>?
??????????? <gradient android:startColor="#0d76e1" android:endColor="#0d76e1"?
??????????????? android:angle="270" />?
??????????? <stroke android:width="1dip" android:color="#f403c9" />?
??????????? <corners android:radius="2dp" />?
??????????? <padding android:left="10dp" android:top="10dp"?
??????????????? android:right="10dp" android:bottom="10dp" />?
??????? </shape>?
??? </item>?
??
??? <item android:state_focused="true">?
??????? <shape>?
??????????? <gradient android:startColor="#ffc2b7" android:endColor="#ffc2b7"?
??????????????? android:angle="270" />?
??????????? <stroke android:width="1dip" android:color="#f403c9" />?
??????????? <corners android:radius="2dp" />?
??????????? <padding android:left="10dp" android:top="10dp"?
??????????????? android:right="10dp" android:bottom="10dp" />?
??????? </shape>?
??? </item>?
??
??? <item>?
??????? <shape>?
??????????? <gradient android:startColor="#000000" android:endColor="#ffffff"?
??????????????? android:angle="180" />?
??????????? <stroke android:width="1dip" android:color="#f403c9" />?
??????????? <corners android:radius="5dip" />?
??????????? <padding android:left="10dp" android:top="10dp"?
??????????????? android:right="10dp" android:bottom="10dp" />?
??????? </shape>?
??? </item>?
</selector>??
?
gradient 主體漸變 startColor開始顏色,endColor結(jié)束顏色 ,angle開始漸變的角度(值只能為90的倍數(shù),0時(shí)為左到右漸變,90時(shí)為下到上漸變,依次逆時(shí)針類推)
stroke 邊框 width 邊框?qū)挾?,color 邊框顏色
corners 圓角 radius 半徑,0為直角
padding text值的相對(duì)位置
3、圓角的Button
在res目錄下的drawable-mdpi建立xml文件shape.xml,如下圖所示:
shape.xml
<?xml version="1.0"encoding="UTF-8"?>
<shape
????xmlns:android="http://schemas.android.com/apk/res/android"
??? android:shape="rectangle">
????<!--?填充的顏色 -->
????<solid?android:color="#FFFFFF"/>
????<!--?設(shè)置按鈕的四個(gè)角為弧形 -->
????<!-- android:radius?弧形的半徑 -->
????<corners?android:radius="5dip"/>
?????
<!-- padding:Button里面的文字與Button邊界的間隔 -->
<padding
???android:left="10dp"
?? android:top="10dp"
?? android:right="10dp"
?? android:bottom="10dp"
/>
</shape>
?
main.xml
在android:background="@drawable/shape"就使用了shape.xml資源
<?xml version="1.0"encoding="utf-8"?>
<LinearLayout?xmlns:android="http://schemas.android.com/apk/res/android"
??? android:orientation="vertical"
??? android:layout_width="fill_parent"
??? android:layout_height="fill_parent"
????>
<TextView???
????android:layout_width="fill_parent"??
??? android:layout_height="wrap_content"??
??? android:text="@string/hello"
????/>??
<Button??
????android:id="@+id/roundButton"
??? android:text="?圓角按鈕 "
??? android:layout_width="wrap_content"??
??? android:layout_height="wrap_content"??
??? android:background="@drawable/shape"
????/>
</LinearLayout>
strings.xml
<?xml version="1.0"encoding="utf-8"?>
<resources>
????<string?name="hello">Hello World, RoundButtonDemoActivity!</string>
????<string?name="app_name">RoundButtonDemo</string>
</resources>
RoundButtonDemoActivity.java
package?com.android.RoundButtonDemo.activity;?
?
import?android.app.Activity;?
import?android.os.Bundle;?
import?android.view.View;?
import?android.view.View.OnClickListener;?
import?android.widget.Button;?
import?android.widget.Toast;?
?
publicclass?RoundButtonDemoActivity?extends?Activity {?
??? Button roundButton;?
??? @Override
????publicvoid?onCreate(Bundle savedInstanceState) {?
?????? ?super.onCreate(savedInstanceState);?
??????? setContentView(R.layout.main);?
?????????
???????roundButton=(Button)findViewById(R.id.roundButton);?
??????//使用匿名類注冊(cè)Button事件?
??????? roundButton.setOnClickListener(new?OnClickListener()?
????? {??????
????????????publicvoid?onClick(View v)?
??????????? {?
???????????????Toast.makeText(RoundButtonDemoActivity.this,"你點(diǎn)擊了圓角按鈕",Toast.LENGTH_LONG).show();?
??????????? }?
??????? });?
??? }?
}
效果圖:
4、動(dòng)畫按鈕
http://blog.csdn.net/qiujuer/article/details/39831451