Android4開發入門經典 之 第四部分:使用者介面【私塾線上原創】

xinqing010發表於2012-03-01

基本概念

常用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 View
 

Android常用的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 則可在給定的字元區域使用樣式,例如:

java程式碼:
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“ ,就可以得到比正常情況小的Button
ToggleButton,就是點選,狀態會交替出現的Button

java程式碼:
在程式裡面可以通過isChecked方法來判斷當前是否選中的狀態

java程式碼:
ImageButton

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

Checkbox、RadioGroup和RadioButton

配置的示例如下


java程式碼:

    
    
    
    

Spinner

配置的示例如下


java程式碼:

準備資料,如果是固定的資料,可以在string下面新建一個arrays.xml,內容配置的示例如下:


java程式碼:

  
    red
    green
    blue
  

在程式裡面把資料設定到Spinner,示例程式碼如下:


java程式碼:
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,而完全用程式設定,示例程式碼:


java程式碼:
ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_spinner_item); 
adapter.add("red");
adapter.add("blue");
如果要動態的修改資料,可以使用ArrayAdapter的add和remove方法,注意:固定資料是不可以修改的,也就是不支援這些方法
在事件處理裡面,會直接傳入被選中項的位置,也就是索引
如果要取得被選中項的文字,可以使用如下程式碼:

java程式碼:
sp.getSelectedItem().toString()

ProgressBar

基本的進度條,直接在佈局檔案裡面配置,示例如下:


java程式碼:
可以通過設定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,示例程式碼如下:


java程式碼:
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,示例程式碼如下:


java程式碼:
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需要的資料,示例如下:

java程式碼:
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,示例程式碼如下:


java程式碼:

    
        
    

然後在自定義的介面卡裡面,在構造方法裡面,新增如下的程式碼:


java程式碼:
TypedArray attr = mContext.obtainStyledAttributes(R.styleable.MyGallery);
mGalleryItemBackground = attr.getResourceId(
      R.styleable.MyGallery_android_galleryItemBackground, 0);

有了風格過後,在建立ImageView的時候,就可以使用這個風格了,在getView方法裡面新增如下程式碼:


java程式碼:
imageView.setBackgroundResource(mGalleryItemBackground);
這樣每個ImageView就都會有一個相同的背景了。

AutoComplete

AutoComplete的使用比較簡單,首先在佈局檔案裡面配置使用AutoCompleteTextView

然後在程式裡面,為它設定值,示例程式碼如下:


java程式碼:
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,裡面配置示例如下:

java程式碼:

當然也可使用系統提供的佈局,比如:android.R.layout.simple_dropdown_item_1line
 
上面的示例是輸入單個值的,要想一次輸入多個值,而且每個都想要有自動完成的功能該怎麼辦呢?可以使用MultiAutoCompleteTextView

首先在佈局檔案設定使用MultiAutoCompleteTextView,示例程式碼如下:


java程式碼:

然後在程式中,為他設定值,示例程式碼如下:


java程式碼:
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


java程式碼:

  
      
      
      

java程式碼:

         
  
    
    
    
  

RelativeLayout


java程式碼:

    
    
    
    

 

TableLayout


java程式碼:

    
        
        
    
    
        
        
    
    
    
        
        
        
    

TableLayout的常用屬性如下:

android:stretchColumns :拉伸指定的列來填充一行的空白
android:collapseColumns :隱藏指定的列,隱藏多列用逗號分開,如“1,2”
android:shrinkColumns :收縮指定的列
android:layout_column :widget在一行裡面所在的column的索引
android:layout_span :widget跨越的列數,也就是合併的列數

GridView

首先在佈局檔案裡面配置使用GridView,示例程式碼如下:


java程式碼:

然後在程式裡面,為它設定值,示例程式碼如下:


java程式碼:
GridView gridview = (GridView) findViewById(R.id.gridview);
gridview.setAdapter(new ImageAdapter(this));

然後在程式裡面,為它設定值,需要使用一個自定義的Adapter,示例程式碼如下:


java程式碼:
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,示例程式碼如下:


java程式碼:
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,首先需要在佈局檔案裡面定義,示例程式碼如下:

 

java程式碼:

  
    
    
  
nTabHost就是用來存放多個Tab的容器

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,示例程式碼如下:


java程式碼:
TabHost tabHost = getTabHost();

3:建立一個Intent物件,做為點選tab後的事件響應,示例程式碼如下:


java程式碼:
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中即可,示例程式碼如下:


java程式碼:
tabHost.addTab(spec);
6:如法炮製,就可以新增任意多個Tab了。
如果要設定預設選中的Tab,可以使用TabHost的setCurrentTab方法

如果想要給Tab設定圖片,方法步驟如下:

1:為每個Tab準備好兩張圖片,一張是選中時使用,一張是未選中時使用
2:在res/drawable/ 下面,為每個tab增加一個選擇器檔案,用來告訴tab如何選擇使用這些圖片,比如my_tab1_selector.xml、 my_tab2_selector.xml,示例程式碼如下:

java程式碼:

    
    
3:在程式中,得到Resources物件,可以通過它來獲取資源,示例程式碼如下:

java程式碼:
Resources res = getResources();
4:在建立TabSpec的時候,在設定每個TabSpec的Indicator的時候,設定這個Indicator使用的圖片資源,示例程式碼如下:

java程式碼:
spec = tabHost.newTabSpec("FirstTag").setIndicator(
"第一個Tab",res.getDrawable(R.drawable.my_tab1_selector))
                  .setContent(intent);
5:如法炮製,就可以為每個Tab設定圖示了。
 

ListView

對於最基本的ListView,直接在程式碼裡面寫,示例如下:


java程式碼:
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的單選模式,示例程式碼如下:


java程式碼:
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的多選模式,示例程式碼如下:


java程式碼:
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佈局檔案中


java程式碼:

    



在ListView的Item的佈局檔案中


java程式碼:




java程式碼:






 

在java程式中

1:要繼承ListActivity
2:使用Adapter來為List設定值

java程式碼:
 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的點選事件

java程式碼:
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
System.out.println("sssssssss===="+l.getItemAtPosition(position));

選單

在Android系統中,選單分成三種

1:Options Menu :就是當你按MENU鍵的時候顯示的選單
2:Context Menu :在點選的地方浮動出現的選單
3:Submenu  : 子選單

建立選單資源

通常在選單資源的xml裡面,把選單項都預先定義好。雖然也可以在程式中通過程式碼新增選單項,但更推薦使用選單資源的xml。
1:在res/menu/ 下建立選單的xml檔案,示例程式碼如下:

java程式碼:

    
    
2:在程式碼裡面使用選單資原始檔,示例如下:

java程式碼:
public boolean onCreateOptionsMenu(Menu menu) {   
MenuInflater inflater = getMenuInflater();   
inflater.inflate(R.menu.test_menu, menu);   
return true;
}

響應選單,在程式裡面,需要寫程式碼來實現選單被點選後要實現的功能


java程式碼:
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引數。示例如下:

java程式碼:
public void myToAdd(MenuItem item) {
Log.i("javass","now in myToAdd");
}
當配置android:onClick後,上面的onOptionsItemSelected裡面對應的選單處理就不會被呼叫了

上下文選單

上下文選單就相當於PC上的右擊,建立上下文選單:

1:選單項同樣來源於選單資原始檔
2:為需要上下文選單的view進行註冊,示例如下:

java程式碼:
this.registerForContextMenu(btnRun);
3:覆寫onCreateContextMenu方法,示例如下:

java程式碼:
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:處理選單事件,示例如下:

java程式碼:
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);
}
}

子選單

建立子選單非常簡單,只需要在選單資原始檔中配置即可,示例如下:


java程式碼:

                   
                       
                   
        
    
選單的事件處理跟前面的做法是一樣的。
子選單可以配合Option選單或Content選單使用。

給選單分組

給選單分組非常簡單,只需要在選單資原始檔中配置即可,示例如下:


java程式碼:
     
               
           

分組後能幹什麼

1:可以通過使用setGroupVisible()方法來顯示或隱藏一組選單
2:可以通過使用setGroupEnabled()方法來使一組選單可用還是不可用
3:可以通過使用setGroupCheckable()方法來使一組選單可選還是不可選

可選選單

可選選單非常簡單,只需要在選單資原始檔中配置即可,示例如下:

1:對於單個選單項,新增android:checkable,即可變成帶核取方塊的選單
2:對於分組的選單,直接在Group上新增android:checkableBehavior的配置,它有三個選項:單選、複選、不能選擇。

可選選單一般針對上下文選單和子選單

要注意:使用可選選單的時候,選擇的狀態必須要通過程式來儲存,否則下次進入的時候,是不會保留你選擇的狀態的。可以在對應的事件處理裡面保留選項的狀態,然後在選單重新繪製的時候,重新設定狀態。

1:對於Options的子選單,可以在onPrepareOptionsMenu方法裡面設定狀態,示例程式碼如下:


java程式碼:
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,示例如下:

java程式碼:
2:也可以在程式中設定,示例如下:

java程式碼:
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上,比如:

java程式碼:
   


或者把android:actionLayout=“@layout/searchview” 換成:
android:actionViewClass="android.widget.SearchView"
關於搜尋條和更多Widget的使用,將在後面的高階課程裡面講述。
修改Action Bar的風格

1:簡單的修改,可以通過:

setBackgroundDrawable()方法:設定Action Bar的背景圖
setDisplayUseLogoEnabled()方法:設定可以改變logo,可以通過setLogo方法來設定新的logo。
示例如下:

java程式碼:
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的方式,比如:

java程式碼:

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


java程式碼:
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

java程式碼:
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(),示例如下:

java程式碼:
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 (),示例如下:

java程式碼:
inal 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:在外部定義:

java程式碼:
HandlerThread ht = new HandlerThread("MyThread");
Handler h = null;
2:在啟動Dialog的方法裡面:

java程式碼:
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方法裡面,示例如下:


java程式碼:
dialog = new ProgressDialog(HelloWorldActivity.this);
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setMessage("裝載中...");
dialog.setCancelable(false);
dialog.setMax(10);

2:定義Handler和Runnable


java程式碼:
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,示例如下:


java程式碼:

2:在程式中啟動Progress Bar,示例如下:


java程式碼:
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,那麼首先需要定義自己的佈局,示例如下:


java程式碼:

    
    

在程式中獲取這些物件,然後設定相應的屬性,再顯示出來,示例如下:


java程式碼:
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


java程式碼:
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:

java程式碼:
HandlerThread ht = new HandlerThread("MyThread");
Handler h = null;
2:在某個地方(比如某個按鈕操作裡面)啟動HandlerThread:

java程式碼:
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:在某個地方(比如某個按鈕操作裡面)傳送訊息:

java程式碼:
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屬性,示例如下:


java程式碼:
Toast t = Toast.makeText(HelloWorldActivity.this,"okok", Toast.LENGTH_SHORT);
t.setGravity(Gravity.TOP|Gravity.LEFT, 5,10);
t.show();

訂製Toast,需訂製佈局檔案,這裡使用上一個示例的佈局檔案來示例,程式寫法如下:


java程式碼:
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發出。示例如下:


java程式碼:
//獲取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的配置檔案,這裡使用前面示例用的Layout
2:不再呼叫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;
 
視訊配套PPT,視訊地址【 Android4開發入門經典獨家視訊課程

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26715458/viewspace-717426/,如需轉載,請註明出處,否則將追究法律責任。

相關文章