Android4開發入門經典 之 第四部分:使用者介面
基本概念
常用Widgets和佈局
常用的Widgets
TextView、Button、 EditText、CheckBox、RadioGroup、RadioButton、Spinner、ProgressBar、ImageView、Date Picker、Time Picker、Rating Bar、Gallery 、Auto Complete ……常用的Layout
Linear Layout、Relative Layout、Table Layout、Grid View、Tab Layout、List ViewAndroid常用的Widgets的屬性大同小異,這裡以TextView為例來看一看
1:android:autoLink設定是否當文字為URL連結/email/電話號碼/map時,文字顯示為可點選的連結。可選值(none/web/email/phone/map/all)
2:android:autoText
如果設定,將自動執行輸入值的拼寫糾正。此處無效果,在顯示輸入法並輸入的時候起作用。
3:android:bufferType
指定getText()方式取得的文字類別。選項editable 類似於StringBuilder可追加字元,也就是說可呼叫append方法設定文字內容。spannable 則可在給定的字元區域使用樣式,例如:
TextView tv = new TextView(this);
SpannableStringBuilder style=new SpannableStringBuilder("這是測試111");
style.setSpan(new ForegroundColorSpan(Color.RED), 0, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
style.setSpan(new ForegroundColorSpan(Color.YELLOW), 2, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
style.setSpan(new ForegroundColorSpan(Color.BLUE), 4, 6, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.setText(style);
4:android:capitalize
設定英文字母大寫型別。此處無效果,需要彈出輸入法才能看得到,參見EditView此屬性說明。
5:android:cursorVisible
設定游標為顯示/隱藏,預設顯示。
6:android:digits
設定允許輸入哪些字元。如“1234567890.+-*/% ()”
7:android:drawableBottom
在text的下方輸出一個drawable,如圖片。如果指定一個顏色的話會把text的背景設為該顏色,並且同時和background使用時覆蓋後者。
8:android:drawableLeft
在text的左邊輸出一個drawable,如圖片。
9:android:drawablePadding
設定text與drawable(圖片)的間隔,與drawableLeft、 drawableRight、drawableTop、drawableBottom一起使用,可設定為負數,單獨使用沒有效果。
10:android:drawableRight
在text的右邊輸出一個drawable。
11:android:drawableTop
在text的正上方輸出一個drawable。
12:android:editable
設定是否可編輯。
13:android:editorExtras
設定文字的額外的輸入資料。
14:android:ellipsize
設定當文字過長時,該控制元件該如何顯示。有如下值設定:”start”—-省略前面顯示不了的資料;”end” ——省略後面顯示不了的資料;”middle”—-省略中間顯示不了的資料;”marquee” ——以跑馬燈的方式顯示(動畫橫向移動)
15:android:freezesText
設定儲存文字的內容以及游標的位置。
16:android:gravity
設定文字位置,如設定成“center”,文字將居中顯示。
17:android:hintText
為空時顯示的文字提示資訊,可通過textColorHint設定提示資訊的顏色。此屬性在 EditView中使用,但是這裡也可以用。
18:android:imeOptions
附加功能,設定右下角IME動作與編輯框相關的動作,如actionDone右下角將顯示一個“完成”,而不設定預設是一個回車符號。這個在EditView中使用,此處無用。
19:android:imeActionId
設定IME動作ID。
20:android:imeActionLabel
設定IME動作標籤。
21:android:includeFontPadding
設定文字是否包含頂部和底部額外空白,預設為true。
22:android:inputMethod
為文字指定輸入法,需要完全限定名(完整的包名)。例如:com.google.android.inputmethod.pinyin。
23:android:inputType
設定文字的型別,用於幫助輸入法顯示合適的鍵盤型別。在EditView中使用,這裡無效果。
24:android:linksClickable
設定連結是否點選連線,即使設定了autoLink。
25:android:marqueeRepeatLimit
在ellipsize指定marquee的情況下,設定重複滾動的次數,當設定為 marquee_forever時表示無限次。設定跑馬燈的效果
android:singleLine="true"
android:focusable="true"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:focusableInTouchMode="true"
26:android:ems
設定TextView的寬度為N個字元的寬度。這裡測試為一個漢字字元寬度
27:android:maxEms
設定TextView的寬度為最長為N個字元的寬度。與ems同時使用時覆蓋ems選項。
28:android:minEms
設定TextView的寬度為最短為N個字元的寬度。與ems同時使用時覆蓋ems選項。
29:android:maxLength
限制顯示的文字長度,超出部分不顯示。
30:android:lines
設定文字的行數,設定兩行就顯示兩行,即使第二行沒有資料。
31:android:maxLines
設定文字的最大顯示行數,與width或者layout_width結合使用,超出部分自動換行,超出行數將不顯示。
32:android:minLines
設定文字的最小行數,與lines類似。
33:android:lineSpacingExtra
設定行間距。
34:android:lineSpacingMultiplier
設定行間距的倍數。如”1.2”
35:android:numeric
如果被設定,該TextView有一個數字輸入法。此處無用,設定後唯一效果是TextView有點選效果,此屬性在EdtiView將詳細說明。
36:android:password
以小點”.”顯示文字
37:android:phoneNumber
設定為電話號碼的輸入方式。
38:android:privateImeOptions
設定輸入法選項,此處無用,在EditText將進一步討論。
39:android:scrollHorizontally
設定文字超出TextView的寬度的情況下,是否出現橫拉條。
40:android:selectAllOnFocus、
如果文字是可選擇的,讓他獲取焦點而不是將游標移動為文字的開始位置或者末尾位置。 TextView中設定後無效果。
41:android:shadowColor
指定文字陰影的顏色,需要與shadowRadius一起使用。
41:android:shadowDx
設定陰影橫向座標開始位置。
42:android:shadowDy
設定陰影縱向座標開始位置。
43:android:shadowRadius
設定陰影的半徑。設定為0.1就變成字型的顏色了,一般設定為3.0的效果比較好。
44:android:singleLine
設定單行顯示。如果和layout_width一起使用,當文字不能全部顯示時,後面用“…”來表示。
如android:text=“test_ singleLine “,android:singleLine=”true” android:layout_width=“20dp”將只顯示“t…”。如果不設定singleLine或者設定為false,文字將自動換行
45:android:text 設定顯示文字.
46:android:textAppearance
設定文字外觀。如 “?android:attr/textAppearanceLargeInverse”這裡引用的是系統自帶的一個外觀,?表示系統是否有這種外觀,否則使用預設的外觀。可設定的值如下:
textAppearanceButton/textAppearanceInverse/textAppearanceLarge/textAppearanceLargeInverse/textAppearanceMedium/textAppearanceMediumInverse/textAppearanceSmall/textAppearanceSmallInverse
47:android:textColor
設定文字顏色
48:android:textColorHighlight
被選中文字的底色,預設為藍色
49:android:textColorHint
設定提示資訊文字的顏色,預設為灰色。與hint一起使用。
50:android:textColorLink
文字連結的顏色.
51:android:textScaleX
設定文字之間間隔,預設為1.0f。
52:android:textSize
設定文字大小,推薦度量單位”sp”,如”15sp”
53:android:textStyle
設定字形[bold(粗體) 0, italic(斜體) 1, bolditalic(又粗又斜) 2] 可以設定一個或多個,用“|”隔開
54:android:typeface
設定文字字型,必須是以下常量值之一:normal 0, sans 1, serif 2, monospace(等寬字型) 3]
55:android:height
設定文字區域的高度,支援度量單位:px(畫素)/dp/sp/in/mm(毫米)
56:android:maxHeight
設定文字區域的最大高度
57:android:minHeight
設定文字區域的最小高度
58:android:width
設定文字區域的寬度,支援度量單位:px(畫素)/dp/sp/in/mm(毫米),與layout_width 的區別看這裡。
59:android:maxWidth
設定文字區域的最大寬度
60:android:minWidth
設定文字區域的最小寬度
Button
正常Button,同以前使用一樣。只不過註冊事件的時候,還可以在佈局檔案裡面直接註冊事件處理,形如:android:OnClick=“testMethod”,那麼執行的時候,會呼叫public void testMethod(View view){ }的方法。Small的Button
只需要在設定中新增style= “?android:attr/buttonStyleSmall“ ,就可以得到比正常情況小的ButtonToggleButton,就是點選,狀態會交替出現的Button。
在程式裡面可以通過isChecked方法來判斷當前是否選中的狀態。
ImageButton
Checkbox、RadioGroup和RadioButton
EditText
限制輸入框內容的屬性,在layout中配置資訊1:android:digits="1234567890.+-*/%()“
限制輸入框中只能輸入自己定義的這些字串 如果輸入其它將不予以顯示
2:android:phoneNumber="true“ 限制輸入框中只能輸入手機號碼
3:android:password="true“限制輸入框中輸入的任何內容將以“*”符號來顯示
4:android:hint=“預設文字“ 輸入內容前預設顯示在輸入框中的提示文字
5:android:textColorHint="#FF0000“設定文字內容顏色
6:android:enabled="false“設定輸入框不能被編輯
7:android:maxLength=“10“ 控制輸入的最大長度
8:android:numeric 控制輸入的數字型別
selectAll()方法是內容全選,getSelectionStart()和getSelectionEnd()可以用於獲取選中的內容
可以通過設定EditText的高度來模擬TextArea
Spinner
準備資料,如果是固定的資料,可以在string下面新建一個arrays.xml。
在程式裡面把資料設定到Spinner,示例程式碼如下:
final Spinner sp = (Spinner)this.findViewById(R.id.spinner);
//準備資料
ArrayAdapter adapter = ArrayAdapter.createFromResource(
this, R.array.colors, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
//把資料設定到spinner
sp.setAdapter(adapter);
為Spinner設定事件處理,呼叫setOnItemSelectedListener方法來設定
要指定預設的選項,可以使用setSelection方法
如果是動態的資料,可以不用定義arrys.xml,而完全用程式設定,示例程式碼:
ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_spinner_item);
adapter.add("red");
adapter.add("blue");
如果要動態的修改資料,可以使用ArrayAdapter的add和remove方法,注意:固定資料是不可以修改的,也就是不支援這些方法
在事件處理裡面,會直接傳入被選中項的位置,也就是索引
如果要取得被選中項的文字,可以使用如下程式碼:
sp.getSelectedItem().toString()
ProgressBar
基本的進度條,直接在佈局檔案裡面配置。可以通過設定incrementProgressBy()方法來增加進度,incrementProgressBy()方法來減少進度;當然對應的也有incrementSecondaryProgressBy()方法和incrementSecondaryProgressBy()方法。 增加設定正數,減少設定負數。
當然也可以直接使用setProgress和setSecondaryProgress方法來改變進度。
可以通過修改style來顯示不同的進度樣式,具體的Style可以從文件得到。
ImageView
主要是在佈局檔案裡面配置,常見屬性如下:1:src:設定要展示的圖片
2:adjustViewBounds:調整邊框時是否保持可繪製物件的寬高比。需要與maxWidth、MaxHeight一起使用,否則單獨使用沒有效果。比如想設定圖片固定大小,又想保持圖片寬高比,需要如下設定:
1) 設定setAdjustViewBounds為true;
2) 設定maxWidth、MaxHeight;
3) 設定設定layout_width和layout_height為wrap_content。
3:scaleType:設定圖片的填充方式。 有如下可取的值:
1)matrix :用矩陣來繪圖
2)fitXY:拉伸圖片(不按比例)以填充View的寬高
3)fitStart :按比例拉伸圖片,拉伸後圖片的高度為View的高度,且顯示在View的左邊
4)fitCenter :按比例拉伸圖片,拉伸後圖片的高度為View的高度,且顯示在View的中間
5)fitEnd :按比例拉伸圖片,拉伸後圖片的高度為View的高度,且顯示在View的右邊
6)center :按原圖大小顯示圖片,但圖片寬高大於View的寬高時,截圖圖片中間部分顯示
7)centerCrop :按比例放大原圖直至等於某邊View的寬高顯示。
8)centerInside :當原圖寬高或等於View的寬高時,按原圖大小居中顯示;反之將原圖縮放至View的寬高居中顯示。
DatePicker
DatePicker元件通常是通過Dialog來顯示的,所以在需要DatePicker的地方,需要呼叫顯示Dialog的方法,也就是showDialog(int)方法。
在建立Dialog的回撥方法中,去真正建立DatePickerDialog,示例程式碼如下:
protected Dialog onCreateDialog(int id) {
switch (id) {
case 1:
return new DatePickerDialog(this,
mDateSetListener,
mYear, mMonth, mDay);
}
return null;
}
注意:上面程式碼裡面的mDateSetListener為OnDateSetListener的實現,在裡面處理日期選擇後的後續處理。
TimePicker
TimePicker的使用和DatePicker的使用大同小異,也是在需要TimePicker的地方,通常需要呼叫顯示Dialog的方法,也就是showDialog(int)方法。
在建立Dialog的回撥方法中,去真正建立TimePickerDialog,示例程式碼如下:
protected Dialog onCreateDialog(int id) {
switch (id) {
case TIME_DIALOG_ID:
return new TimePickerDialog(this,
mTimeSetListener, mHour, mMinute, false);
}
return null;
}
注意:
1:上面程式碼裡面的mTimeSetListener為OnTimeSetListener的實現,在裡面處理日期選擇後的後續處理。
2:TimePicker只有時和分,沒有秒,後面一個boolean參數列示是否24小時
RatingBar
RatingBar的使用非常簡單,在佈局檔案裡面,定義好RatingBar,然後在程式碼裡面,就可以通過實現OnRatingBarChangeListener,來獲取評分的結果了。常用屬性如下:
1:isIndicator:是否是一個指示器(使用者無法進行更改)2:numStars:顯示的星型數量,是一個整數值
3:rating:預設的評分,是浮點型別
4:stepSize:評分的步長,是浮點型別,通常設定成“1.0”
5:style:這個要注意,前面不加“android:”,直接使用style,當然可以不設定,使用預設的風格,如果要設定風格,常用的風格示例如下:
1)style="?android:attr/ratingBarStyleIndicator“
2)style="?android:attr/ratingBarStyleSmall“
3)style="?android:attr/ratingBarStyle"
Gallery
Gallery的使用相對要麻煩一點,首先在佈局檔案裡面要定義然後在程式裡面,需要對Gallery賦值,也就是設定要展示的圖片,這就需要自定義一個Adapter,來把圖片的資料適配成為Gallery需要的資料,示例如下:
class ImageAdapter extends BaseAdapter {
private Context mContext;
private Integer[] mImageIds = {R.drawable.icon,R.drawable.icon,
R.drawable.icon,R.drawable.icon,R.drawable.icon,R.drawable.icon,
R.drawable.icon,R.drawable.icon,R.drawable.icon,R.drawable.icon};
public ImageAdapter(Context c) { mContext = c; }
public int getCount() { return mImageIds.length; }
public Object getItem(int position) { return position; }
public long getItemId(int position) { return position; }
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView = new ImageView(mContext);
imageView.setImageResource(mImageIds[position]);
imageView.setLayoutParams(new Gallery.LayoutParams(150, 100));
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
return imageView;
}
}
然後在程式裡面,對Gallery設定Adapter,當然就是剛才實現的自定義的Adapter例項了。
Gallery的事件監聽器是:OnItemClickListener,通過它可以實現事件處理
如果要給Gallery設定風格的話,需要在res/values資料夾下面建立一個attrs.xml
然後在自定義的介面卡裡面,在構造方法裡面,新增如下的程式碼:
TypedArray attr = mContext.obtainStyledAttributes(R.styleable.MyGallery);
mGalleryItemBackground = attr.getResourceId(
R.styleable.MyGallery_android_galleryItemBackground, 0);
有了風格過後,在建立ImageView的時候,就可以使用這個風格了,在getView方法裡面新增如下程式碼:
imageView.setBackgroundResource(mGalleryItemBackground);
這樣每個ImageView就都會有一個相同的背景了。
AutoComplete
AutoComplete的使用比較簡單,首先在佈局檔案裡面配置使用AutoCompleteTextView然後在程式裡面,為它設定值,示例程式碼如下:
AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.autocomplete);
ArrayAdapter adapter = new ArrayAdapter(this, R.layout.autoc_item, new String[]{"abc","abd","abcd","bcd","bef"});
textView.setAdapter(adapter);
由於元件在顯示提示資料的時候,是採用的列表的形式,因此需要去為list中的每個項定義一個佈局檔案,其實非常簡單,用TextView即可,比如,在layout資料夾裡面新增一個auto_item.xml。
當然也可使用系統提供的佈局,比如:android.R.layout.simple_dropdown_item_1line
上面的示例是輸入單個值的,要想一次輸入多個值,而且每個都想要有自動完成的功能該怎麼辦呢?可以使用MultiAutoCompleteTextView
首先在佈局檔案設定使用MultiAutoCompleteTextView。
然後在程式中,為他設定值,示例程式碼如下:
MultiAutoCompleteTextView textView = (MultiAutoCompleteTextView) findViewById(R.id.autocomplete);
ArrayAdapter adapter = new ArrayAdapter(this, R.layout.autoc_item, new String[]{"abc","abd","abcd","bcd","bef"});
textView.setAdapter(adapter);
textView.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());
最後一句是設定多個值之間用什麼分割,不可少。
LinearLayout
RelativeLayout
TableLayout
TableLayout的常用屬性如下:
android:stretchColumns :拉伸指定的列來填充一行的空白
android:collapseColumns :隱藏指定的列,隱藏多列用逗號分開,如“1,2”
android:shrinkColumns :收縮指定的列
android:layout_column :widget在一行裡面所在的column的索引
android:layout_span :widget跨越的列數,也就是合併的列數
GridView
首先在佈局檔案裡面配置使用GridView,
然後在程式裡面,為它設定值,示例程式碼如下:
GridView gridview = (GridView) findViewById(R.id.gridview);
gridview.setAdapter(new ImageAdapter(this));
然後在程式裡面,為它設定值,需要使用一個自定義的Adapter,示例程式碼如下:
class ImageAdapter extends BaseAdapter {
private Context mContext;
public ImageAdapter(Context c) { mContext = c; }
public int getCount() {return mThumbIds.length; }
public Object getItem(int position) { return null;}
public long getItemId(int position) { return 0; }
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView == null) {
imageView = new ImageView(mContext);
imageView.setLayoutParams(new GridView.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
imageView.setPadding(0, 0,0,0);
imageView.setBackgroundColor(Color.RED);
} else {
imageView = (ImageView) convertView;
}
imageView.setImageResource(mThumbIds[position]);
return imageView;
}
private Integer[] mThumbIds = {
R.drawable.icon, R.drawable.icon,
R.drawable.icon, R.drawable.icon,
R.drawable.icon, R.drawable.icon,
R.drawable.icon, R.drawable.icon
};
}
事件處理是實現OnItemClickListener,示例程式碼如下:
gridview.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView parent, View v,
int position, long id) {
Toast.makeText(TestWidgets.this, "" + position,
Toast.LENGTH_SHORT).show();
}
});
TabLayout
要實現基本的TabLayout,首先需要在佈局檔案裡面定義,TabWidget就是實現Tab的Widget
FrameLayout是Tab的內容,FrameLayout是Android最簡單的佈局物件。它被定製為螢幕上的一個空白區域,可以在其中填充一個單一物件 ,所有的子元素將會固定在左上角;不能為FrameLayout中的子元素指定位置。後一個子元素將會直接覆蓋前一個子元素。TabHost必須設定為@android:id/tabhost,TabWidget必須設定android:id為@android:id/tabs,FrameLayout需要設定android:id為@android:id/tabcontent
有了佈局過後,就可以直接在程式裡面設定Tab了,示例如下:
1:不再繼承Activity,而是繼承TabActivity,對於Tab佈局的實現,現在已經不推薦使用了,建議改用Fragment來實現,但為了學習這個知識,還是沿用。
2:得到TabHost,示例程式碼如下:
TabHost tabHost = getTabHost();
3:建立一個Intent物件,做為點選tab後的事件響應,示例程式碼如下:
Intent intent = new Intent().setClass(this, MyActivity.class);
intent.putExtra("showStr", "第一個tab");
Intent設定的Class就是點選tab,內容頁顯示出來的Activity。4:建立一個TabSpec,也就是一個Tab的描述,包含一個tab加上下面的顯示內容。簡單點說,TabSpec就是一個完整的Tab頁。示例程式碼如下:
TabHost.TabSpec spec = tabHost.newTabSpec("FirstTag")
.setIndicator("第一個Tab").setContent(intent);
5:然後把這個TabSpec新增到TabHost中即可,示例程式碼如下:
tabHost.addTab(spec);
6:如法炮製,就可以新增任意多個Tab了。
如果要設定預設選中的Tab,可以使用TabHost的setCurrentTab方法
如果想要給Tab設定圖片,方法步驟如下:
1:為每個Tab準備好兩張圖片,一張是選中時使用,一張是未選中時使用
2:在res/drawable/ 下面,為每個tab增加一個選擇器檔案,用來告訴tab如何選擇使用這些圖片,比如my_tab1_selector.xml、 my_tab2_selector.xml,
3:在程式中,得到Resources物件,可以通過它來獲取資源,示例程式碼如下:
Resources res = getResources();
4:在建立TabSpec的時候,在設定每個TabSpec的Indicator的時候,設定這個Indicator使用的圖片資源,示例程式碼如下:
spec = tabHost.newTabSpec("FirstTag").setIndicator(
"第一個Tab",res.getDrawable(R.drawable.my_tab1_selector))
.setContent(intent);
5:如法炮製,就可以為每個Tab設定圖示了。
ListView
對於最基本的ListView,直接在程式碼裡面寫,示例如下:
public class TestList extends ListActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// this.setContentView(R.layout.TestList);
setListAdapter(new ArrayAdapter(this,
android.R.layout.simple_list_item_1, new String[]{"111","222","333"}));
}
protected void onListItemClick(ListView l,View v,int position,long id){
super.onListItemClick(l, v, position, id);
String s = ""+l.getItemAtPosition(position);
System.out.println("now click="+s);
}
}
List的單選模式,示例程式碼如下:
setListAdapter(new ArrayAdapter(this,
android.R.layout. simple_list_item_single_choice, new String[]{"111","222","333}));
this.getListView().setItemsCanFocus(false);
this.getListView().setChoiceMode(ListView. CHOICE_MODE_SINGLE);
List的多選模式,示例程式碼如下:
setListAdapter(new ArrayAdapter(this,
android.R.layout.simple_list_item_multiple_choice, new String[]{"111","222","333}));
this.getListView().setItemsCanFocus(false);
this.getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
在ListView裡面設定多個值的方法
在ListView的main.xml佈局檔案中在ListView的Item的佈局檔案中
在java程式中
1:要繼承ListActivity
2:使用Adapter來為List設定值
List list = new ArrayList();
Map map1 = new HashMap();
map1.put("userId","11");
map1.put("userName","11N");
map1.put("age","11");
list.add(map1);
Map map2 = new HashMap();
map2.put("userId","22");
map2.put("userName","22N");
map2.put("age","22");
list.add(map2);
setListAdapter(new SimpleAdapter(this, list,R.layout.list,new String[]{"userId","userName","age"}, new int[]{R.id.userId,R.id.userName,R.id.userAge}));
3:處理item的點選事件
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
System.out.println("sssssssss===="+l.getItemAtPosition(position));
Menu
在Android系統中,選單分成三種
1:Options Menu :就是當你按MENU鍵的時候顯示的選單2:Context Menu :在點選的地方浮動出現的選單
3:Submenu : 子選單
建立選單資源
通常在選單資源的xml裡面,把選單項都預先定義好。雖然也可以在程式中通過程式碼新增選單項,但更推薦使用選單資源的xml。1:在res/menu/ 下建立選單的xml檔案,
2:在程式碼裡面使用選單資原始檔,示例如下:
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.test_menu, menu);
return true;
}
響應選單,在程式裡面,需要寫程式碼來實現選單被點選後要實現的功能
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.to_add:
Log.i("javass","now to add"); break;
case R.id.to_update:
Log.i("javass","now to update"); break;
default: return super.onOptionsItemSelected(item);
}
return true;
}
Option Menu一般最多顯示六個,如果更多的話,會出現一個更多的按鈕。
Android3.0以後,可以直接在選單描述檔案裡面配置android:onClick,指定當選單被點選時要呼叫的方法,該方法接受一個MenuItem引數。示例如下:
public void myToAdd(MenuItem item) {
Log.i("javass","now in myToAdd");
}
當配置android:onClick後,上面的onOptionsItemSelected裡面對應的選單處理就不會被呼叫了
上下文選單
上下文選單就相當於PC上的右擊,建立上下文選單:1:選單項同樣來源於選單資原始檔
2:為需要上下文選單的view進行註冊,示例如下:
this.registerForContextMenu(btnRun);
3:覆寫onCreateContextMenu方法,示例如下:
public void onCreateContextMenu(ContextMenu menu,View v,ContextMenuInfo info) {
super.onCreateContextMenu(menu, v, info);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.test_menu, menu);
}
4:處理選單事件,示例如下:
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
switch (item.getItemId()) {
case R.id. new_file:
Log.i("onContextItemSelected", "now ruuuuuuuuuuu");
return true;
default: return super.onContextItemSelected(item);
}
}
子選單
建立子選單非常簡單,只需要在選單資原始檔中配置即可,選單的事件處理跟前面的做法是一樣的。
子選單可以配合Option選單或Content選單使用。
給選單分組
給選單分組非常簡單,只需要在選單資原始檔中配置即可,分組後能幹什麼
1:可以通過使用setGroupVisible()方法來顯示或隱藏一組選單2:可以通過使用setGroupEnabled()方法來使一組選單可用還是不可用
3:可以通過使用setGroupCheckable()方法來使一組選單可選還是不可選
可選選單
可選選單非常簡單,只需要在選單資原始檔中配置即可,示例如下:1:對於單個選單項,新增android:checkable,即可變成帶核取方塊的選單
2:對於分組的選單,直接在Group上新增android:checkableBehavior的配置,它有三個選項:單選、複選、不能選擇。
可選選單一般針對上下文選單和子選單
要注意:使用可選選單的時候,選擇的狀態必須要通過程式來儲存,否則下次進入的時候,是不會保留你選擇的狀態的。可以在對應的事件處理裡面保留選項的狀態,然後在選單重新繪製的時候,重新設定狀態。1:對於Options的子選單,可以在onPrepareOptionsMenu方法裡面設定狀態,示例程式碼如下:
public boolean onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
MenuItem mi = menu.findItem(R.id.create_new);
mi.setChecked(flag);
return true;
}
2:對於上下文選單或其子選單,可以直接在onCreateContextMenu方法裡面設定,因為這個方法每次都會重新執行。
動態修改選單項
有些時候,需要動態的修改選單項,該怎麼實現呢?對於Options的選單及其子選單
1:覆蓋實現onPrepareOptionsMenu方法。
2:在這個方法裡面使用menu的方法來維護選單項
onPrepareOptionsMenu方法和onCreateOptionsMenu方法
1:onCreateOptionsMenu只是在第一次建立選單的時候呼叫一次,以後就不呼叫了2:onPrepareOptionsMenu方法是每次顯示選單的時候,都要呼叫一次的方法。
對於上下文的選單及其子選單,可以直接在onCreateContextMenu方法裡面設定,因為這個方法每次都會重新執行。
程式設計式實現選單
前面是宣告式實現選單,也可以採用程式設計式的方式來實現選單,常用API為:1:Menu
2:MenuItem
3:SubMenu,與MenuItem平行
關於Menu的圖示
1:子選單的項不能顯示圖示2:上下文選單和項都不能顯示圖示
3:帶圖示的選單項不能加上覆選框
Action Bar基本概念
是什麼
ActionBar是用來替換傳統的title bar的一種新的Widget,通常顯示在螢幕的頂端。通常情況下,Acviton Bar帶著應用的Logo放置到最左端,緊接著是應用的title,而其他可選項放置在右邊。
在Android3.0以後,所有的Activity都預設的帶著ActionBar了。
特點
1:顯示Option Menu中的項,讓使用者能直接操作2:提供tab來在多個Fragment之間導航
3:提供drop-down的導航列表
4:提供直接交戶的Action Views,比如搜尋條等。
使用Action Bar
刪除Action Bar
1:Android系統預設用的是“holographic ” theme,是有Action Bar的,可以在manifext配置檔案中配置Activity的時候,指定不需要Action Bar,2:也可以在程式中設定,示例如下:
ActionBar actionBar = getActionBar();
actionBar.hide();
新增Action Items
一個Action Item就相當於Option Menu中的一個選項。要想把選單項顯示成為Action Item,只需要在選單項的配置檔案中,設定android:showAsAction=“ifRoom” 。也可使用程式設定:menu.getItem(0).setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
Action Items的事件響應,就是Option Menu的事件響應
新增Action View
可以把其他Action View,也就是Widget新增顯示到Action Bar上,典型如搜尋條,這裡簡單的看一下示例:1:可以通過配置android:actionLayout或者android:actionViewClass 的方式,來實現把widget顯示到Action Bar上,比如:
或者把android:actionLayout=“@layout/searchview” 換成:
android:actionViewClass="android.widget.SearchView"
修改Action Bar的風格
1:簡單的修改,可以通過:setBackgroundDrawable()方法:設定Action Bar的背景圖
setDisplayUseLogoEnabled()方法:設定可以改變logo,可以通過setLogo方法來設定新的logo。
示例如下:
ActionBar actionBar = getActionBar();
actionBar.setDisplayUseLogoEnabled(true);
actionBar.setLogo(R.drawable.app_sample_code);
actionBar.setBackgroundDrawable(this.getResources().getDrawable(R.drawable.app_sample_code));
2:可以通過修改theme的方式,
Dialogs
什麼是Dialog
就是在當前Activity上彈出的小視窗,也就是對話方塊。Dialog通常是附屬於Activity的。常見的Dialog
1:AlertDialogA dialog :就是彈出提示或警告資訊的對話方塊2:ProgressDialog : 進度條
3:DatePickerDialog :選擇日期的對話方塊
4:TimePickerDialog :選擇時間的對話方塊
建立和顯示Dialog
一般會在onCreateDialog() 方法裡面去建立Dialog,如果要在這個方法外建立Dialog,那麼需要呼叫setOwnerActivity(Activity)方法來把Dialog和Activity關聯起來。想要顯示Dialog的時候,呼叫showDialog(int)方法即可。
關閉Dialog
可以在Dialog物件裡面使用dismiss()方法,也可以在Activity裡面使用dismissDialog(int)方法。Dismiss listener
如果應用程式想要處理dissmiss dialog的事件,可以定義一個類來實現DialogInterface.OnDismissListener,裡面有一個setOnDismissListener()的方法,會在Dialog被銷燬的時候觸發。當然,Listener需要被註冊,可以使用setOnCancelListener()方法。
實現Dialog風格的Activity
在 AndroidManifest.xml的對應的Activity設定上新增:android:theme="@android:style/Theme.Dialog"
Alert Dialog
建立帶Button的Alert Dialog
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("確定要刪除嗎?")
.setCancelable(false)
.setPositiveButton("取消",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int id) {
Toast.makeText(HelloWorldActivity.this, “dialog取消", Toast.LENGTH_LONG).show();
}
})
.setNegativeButton("確定",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int id) { Toast.makeText(HelloWorldActivity.this,“dialog確定", Toast.LENGTH_LONG).show();
}
});
AlertDialog alert = builder.create();
其實,可以新增三種按鈕,這裡新增的是正面和負面,還有一種是中性的,三種按鈕的排列順序是正面、中性、反面。
建立帶列表的Alert Dialog
final CharSequence[] items = { "紅色", "綠色", "藍色" };
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("請選擇顏色");
builder.setItems(items, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
Toast.makeText(getApplicationContext(), items[item],
Toast.LENGTH_SHORT).show();
}
});
AlertDialog alert = builder.create();
如果想要是單選的列表項,那就不要使用setItems,而用setSingleChoiceItems(),示例如下:
final CharSequence[] items = { "紅色", "綠色", "藍色" };
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("請選擇顏色");
builder.setSingleChoiceItems(items, -1,new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
Toast.makeText(getApplicationContext(), items[item],
Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
AlertDialog alert = builder.create();
如果想要是多選的列表項,那就不要使用setItems,而用setMultiChoiceItems (),示例如下:
final CharSequence[] items = { "紅色", "綠色", "藍色" };
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("請選擇顏色");
builder.setMultiChoiceItems(items, new boolean[]{false,false,false},new DialogInterface.OnMultiChoiceClickListener() {
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
Toast.makeText(getApplicationContext(), items[which], Toast.LENGTH_SHORT).show();
}
});
builder.setNegativeButton("確定",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Toast.makeText(HelloWorldActivity.this, "dialog確定", Toast.LENGTH_LONG).show();
dialog.dismiss();
}
}
);
AlertDialog alert = builder.create();
Progress Dialog
Progress Dialog擴充套件自Alert Dialog如果簡單的使用,只需要呼叫show方法即可,建立就顯示出來了:
ProgressDialog dialog = ProgressDialog.show(HelloWorldActivity.this, "", "裝載中,請稍候...", true, true);
注意:對於這種方法顯示的Dialog,點選介面上其他地方,它就消失了,如果想要它不消失,可以設定setCancelable為false,那通常就需要配合Handler來處理,也就是到了該取消的時候,就由HandlerThread來處理它。示例如下:
1:在外部定義:
HandlerThread ht = new HandlerThread("MyThread");
Handler h = null;
2:在啟動Dialog的方法裡面:
if(!ht.isAlive()){
ht.start();
h = new Handler(ht.getLooper()){
public void handleMessage(Message msg) {
try {
Thread.sleep(5000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
HelloWorldActivity.this.dismissDialog(1);
super.handleMessage(msg);
}
};
}
Message msg = h.obtainMessage();
msg.sendToTarget();
使用Progress Bar,同樣需要配合Handler來執行,示例如下:
1:建立Progress Bar,在onCreateDialog方法裡面,示例如下:
dialog = new ProgressDialog(HelloWorldActivity.this);
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setMessage("裝載中...");
dialog.setCancelable(false);
dialog.setMax(10);
2:定義Handler和Runnable
Handler h = new Handler() {
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(msg.arg1 < dialog.getMax()){dialog.setProgress(msg.arg1);}
else{dialog.dismiss();}}};
int num = 0;
Runnable r = new Runnable() {
public void run() {
Message msg = h.obtainMessage();
msg.arg1 = num++;
h.sendMessage(msg);
h.postDelayed(r, 1000L);
}};
3:在顯示dialog的同時,要啟動Handler的執行,也就是 h.post(r);
也可以通過配置檔案來使用Progress Bar,同樣需要配合Handler來執行,示例如下:
1:在layout的配置檔案裡面建立Progress Bar,
2:在程式中啟動Progress Bar,示例如下:
pb = (ProgressBar)HelloWorldActivity.this.findViewById(R.id.progress_bar);
pb.setMax(10);
pb.setVisibility(View.VISIBLE);
h.post(r);
3: Handler和Runnable的實現跟前面類似,這裡就不去寫了。
Customer Dialog
如果想要使用自己訂製的Dialog,那麼首先需要定義自己的佈局,在程式中獲取這些物件,然後設定相應的屬性,再顯示出來,示例如下:
Context mContext = HelloWorldActivity.this;
Dialog dialog = new Dialog(mContext);
dialog.setContentView(R.layout.my_dialog);
dialog.setTitle("自己訂製的Dialog");
TextView text = (TextView) dialog.findViewById(R.id.text);
text.setText("歡迎使用本系統");
ImageView image = (ImageView) dialog.findViewById(R.id.image);
image.setImageResource(R.drawable.ic_launcher);
//最後顯示出來
dialog.show();
Handler
Handler概述
Handler允許你傳送訊息到一個執行緒的訊息佇列,並處理訊息。Handler和啟動它的主執行緒是執行在同一個執行緒中的。主執行緒通過Handler來排程處理訊息,變相實現了非同步處理。
nHandler應用的地方
1:安排訊息或Runnable 在某個主執行緒中某個地方執行
2:安排一個動作在不同的執行緒中執行,這個要使用HandlerThread
Handler使用
1:建立Handler物件,實現handleMessage方法2:建立Runnable物件,在run方法裡面進行訊息的傳送
3:在主執行緒中啟動Handler,使用post方法或其它類似方法
4:在主執行緒中取消Handler,使用removeCallbacks方法或其它類似方法
示例如下:
Handler
Handler h = new Handler() {
public void handleMessage(Message msg) {
super.handleMessage(msg);
//使用what來區分是什麼樣的訊息
switch (msg.what){
case 1 :
//這裡進行訊息的處理
break;
default :
//這裡進行訊息的處理
}
}};
int what = 0;
Runnable r = new Runnable() {
public void run() {
Message msg = h.obtainMessage();
msg.obj = "1234567";//傳遞的引數
msg.what = what;
what++;
h.sendMessage(msg);
h.postDelayed(r, 1000L);
}};
如果想要啟動新的執行緒來處理,使用HandlerThread的示例如下:
1:先定義Handler和HandlerThread:
HandlerThread ht = new HandlerThread("MyThread");
Handler h = null;
2:在某個地方(比如某個按鈕操作裡面)啟動HandlerThread:
ht.start();
h = new Handler(ht.getLooper()){
public void handleMessage(Message msg) {
super.handleMessage(msg);
//這裡真正處理訊息
Toast.makeText(getApplicationContext(),"msg="+msg.obj,Toast.LENGTH_LONG).show();
}
};
3:在某個地方(比如某個按鈕操作裡面)傳送訊息:
Message msg = h.obtainMessage();
msg.obj="test message";
msg.sendToTarget();
4:在某個地方(比如某個按鈕操作裡面)可以停止HandlerThread,使用stop方法
Notifications
Android系統中,有如下通知型別:
1:Toast Notification:展示後臺的簡短訊息2:Status Bar Notification:展示後臺對使用者的提示,通常需要使用者響應
3:Dialog Notification:Activity相關的通知
指定Toast的位置,使用Gravity屬性,示例如下:
Toast t = Toast.makeText(HelloWorldActivity.this,"okok", Toast.LENGTH_SHORT);
t.setGravity(Gravity.TOP|Gravity.LEFT, 5,10);
t.show();
訂製Toast,需訂製佈局檔案,這裡使用上一個示例的佈局檔案來示例,程式寫法如下:
LayoutInflater inflater = getLayoutInflater();
View layout = inflater.inflate(R.layout.my_dialog,
(ViewGroup) findViewById(R.id.layout_root));
ImageView image = (ImageView) layout.findViewById(R.id.image);
image.setImageResource(R.drawable.ic_launcher);
TextView text = (TextView) layout.findViewById(R.id.text);
text.setText("歡迎您的到來!");
Toast t = new Toast(HelloWorldActivity.this);
t.setView(layout);
t.setGravity(Gravity.CENTER|Gravity.LEFT, 5,10);
t.show();
Status Bar Notification :可以由Activity或Service發出。示例如下:
//獲取NotificationManager
String ns = Context.NOTIFICATION_SERVICE;
NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);
//設定在status bar上顯示的資訊條
int icon = R.drawable.app_sample_code;
CharSequence tickerText = "請注意";
long when = System.currentTimeMillis();
Notification notification = new Notification(icon, tickerText, when);
//設定在status 列表裡面顯示的資訊,以及點選的事件
CharSequence contentTitle = "重要通知";
CharSequence contentText = "測試";
Intent notificationIntent = new Intent(HelloWorldActivity.this, T2.class);
PendingIntent contentIntent = PendingIntent.getActivity(HelloWorldActivity.this, 0, notificationIntent, 0);
notification.setLatestEventInfo(HelloWorldActivity.this, contentTitle, contentText, contentIntent);
//發出通知
mNotificationManager.notify(1, notification);
NotificationManager 是一個系統級的服務
可以通過NotificationManager 來取消自己的Status Bar Notification,就是使用notity時為通知設定的一個ID,示例如下:
mNotificationManager.cancel(1);//1就是前面notity時傳遞的id值,必須唯一
為Notification新增提示聲音
1:使用系統預設的聲音:notification.defaults |= Notification. DEFAULT_SOUND;
2:使用自己上傳的聲音:
notification.sound=Uri.parse("file:///data/data/cn.javass/test_cbr.mp3");
為Notification新增提示振動
1:首先要設定許可權:"android.permission.VIBRATE" />2:使用系統預設的振動:notification.defaults |= Notification.DEFAULT_VIBRATE;
3:自己定義振動的引數:
long[] vibrate = {0,100,200,300};
otification.vibrate = vibrate;
為Notification新增 閃爍 提示,也就是LED燈的閃爍
1:使用系統預設的:notification.defaults |= Notification.DEFAULT_LIGHTS;
2:自己定義閃爍的引數:
notification.ledARGB = 0xff00ff00;
notification.ledOnMS = 300;
notification.ledOffMS = 1000;
notification.flags |= Notification. FLAG_SHOW_LIGHTS;
為Notification新增其他特性
1:FLAG_AUTO_CANCEL:當使用者點選這個通知後,通知自動消失2:FLAG_INSISTENT:重複播放音樂直到使用者響應
3:FLAG_ONGOING_EVENT:在通知視窗增加Ongoing的標記
4:FLAG_NO_CLEAR:標識通知不能被清除掉
客戶化的Notification,只是客戶化在通知資訊列表裡面的展示,其他的跟前面仍然是一樣的,示例如下:
1:自己訂製一個Layout的配置檔案,這裡使用前面示例用的Layout2:不再呼叫notification.setLatestEventInfo這句話,修改成:
RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.my_dialog);
contentView.setImageViewResource(R.id.image, R.drawable.ic_launcher);
contentView.setTextViewText(R.id.title, "重要通知");//這個前面的layout裡面沒有,可以注掉,也可以自己去layout裡面新增上
contentView.setTextViewText(R.id.text, "測試");
//設定在通知資訊列表裡面顯示的檢視
otification.contentView = contentView;
//設定點選通知資訊時觸發的事件
notification.contentIntent = contentIntent;
轉自【http://blog.itpub.net/26715458/viewspace-717426/】
相關文章
- Android4開發入門經典 之 第四部分:使用者介面【私塾線上原創】Android
- Android4開發入門經典 之 第三部分:Activity【私塾線上原創】Android
- Android4開發入門經典 之 第五部分:Service【私塾線上原創】Android
- Android4開發入門經典 之 第八部分:SQLite【私塾線上原創】AndroidSQLite
- Android4開發入門經典 之 第十二部分:最佳實踐【私塾線上原創】Android
- Android4開發入門經典 之 第六部分:Broadcast【私塾線上原創】AndroidAST
- Android4開發入門經典 之 第十部分:多媒體【私塾線上原創】Android
- Android4開發入門經典 之 第九部分:Content Provider【私塾線上原創】AndroidIDE
- Android4開發入門經典 之 第十一部分:網路程式設計【私塾線上原創】Android程式設計
- Android4開發入門經典 之 第七部分(1):資料儲存【私塾線上原創】Android
- Android4開發入門經典 之 第七部分(2):資料儲存【私塾線上原創】Android
- Android4開發入門經典 之 第二部分:Android應用的核心基礎【私塾線上原創】Android
- 《Flutter 入門經典》之“Flutter 入門 ”Flutter
- 嵌入式開發 ARM入門經典
- 【Android開發入門教程】四.使用者介面之LayoutAndroid
- Webpack經典入門Web
- [轉]BI入門經典
- Kafka入門經典教程Kafka
- BI入門經典 (轉)
- 聊聊經典機器學習入門機器學習
- 安卓入門---安卓開發實戰經典1-3章安卓
- Unix 入門經典 筆記筆記
- springboot入門經典Spring Boot
- Python 入門之經典函式例項(二)Python函式
- odoo 開發入門教程系列-一些使用者介面Odoo
- 《HTML5移動應用開發入門經典》——2.9 測驗HTML
- Python入門經典案例一Python
- 《jQueryMobile入門經典》——2.4 總結jQuery
- 最經典的黑客入門教程黑客
- Python:介面開發,wx入門篇Python
- 《Windows Phone 7入門經典之使用Silverlight和XNA開發Windows Phone應用》書評Windows
- 經典加密演算法入門-RSA加密演算法
- 博弈論經典模型解析(入門級)模型
- 《jQueryMobile入門經典》——2.5 問與答jQuery
- 部分JS經典題目解析JS
- 遊戲開發新手入門之DirectX入門(轉)遊戲開發
- C語言入門經典(第5版)C語言
- Go語言入門經典第18章Go