聲明:學習的書籍《Android應用開發揭秘》,這裡記錄學習該書籍的日誌,引用的相關代碼與總結描述,沒有商業的用途,完全是自我學習的一個記錄,剛剛學習不可避免會出現很多問題,若是有錯誤還請大家多多批評。
一、 按鈕(Button)
按鈕控制項已經在之前的例子學習中使用到,主要的是一個setOnClickListener事件。
二、 菜單(Menu)
一般 Android手機都有menu這個按鍵來顯示相應的菜單,實現菜單效果,需要通過onCreateOptionsMenu來實現,然後對其事件進行相關的監聽來實現不同任務,可以通過兩種方式來實現:
1. 通過XML布局實現;
2. 通過Menu.add方法實現
執行個體分析:通過上面兩種方式來實現菜單效果,main.xml使用XML布局方式實現,main2.xml使用Menu.add方法實現。
1. 通過XML布局:
首先需要在res目錄下建立menu檔案夾,並且在該目錄下建立menu.xml檔案,在該檔案中建立需要的菜單。
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/about" android:title="關於"/> <item android:id="@+id/exit" android:title="退出"/></menu>
然後對應的Activity01重寫onCreateOptionsMenu方法來裝載這個menu檔案
//建立menupublic boolean onCreateOptionsMenu(Menu menu) {MenuInflater inflater = this.getMenuInflater();//設定menu介面為res/menu/menu.xmlinflater.inflate(R.menu.menu, menu);return true;}
最後可以加上對功能表按鈕事件的監聽
//處理菜單事件public boolean onOptionsItemSelected(MenuItem item) {// TODO Auto-generated method stub//得到當前選中得MenuItem的IDint item_id = item.getItemId();switch(item_id){case R.id.about://建立一個Intent對象,Intent的使用參考Intent intent = new Intent();//指定intent要啟動的類intent.setClass(Examples_04_13Activity.this, Examples_04_13Activity02.class);//啟動一個新的ActivitystartActivity(intent);//關閉當前的ActivityExamples_04_13Activity.this.finish();break;case R.id.exit:Examples_04_13Activity.this.finish();break;}return true;}
【擴充點】:關於Intent的理解與使用
Intent 是一個將要執行的動作的抽象的描述,一般來說是作為參數來使用,由Intent來協助完成android各個組件之間的通訊。比如說調用startActivity()來啟動一個activity,或者由broadcaseIntent()來傳遞給所有感興趣的BroadcaseReceiver, 再或者由startService()/bindservice()來啟動一個背景service.所以可以看出來,intent主要是用來啟動其他的activity 或者service,所以可以將intent理解成activity之間的粘合劑。
可以參考該文章http://wenku.baidu.com/view/76db47858762caaedd33d452.html
2 通過Menu.add方法:
即在onCreateOptionsMenu方法中通過menu.add方法進行添加,如;
public boolean onCreateOptionsMenu(Menu menu) {//為menu新增內容menu.add(0, 0, 0, R.string.ok);menu.add(0, 0, 1, R.string.back);return true;}
執行個體效果:左圖為第一種實現方式,右圖為第二種實現方式
三、 對話方塊(Dialog)
實現對話方塊效果,主要是使用AlertDialog.Builder類,還可以自訂對話方塊。
執行個體關鍵源碼分析:
Dialog dialog = new AlertDialog.Builder(Examples_04_14Activity.this) .setTitle("登陸提示")//設定標題 .setMessage("這裡需要登陸!")//設定內容 .setPositiveButton("確定", //設定確定按鈕 new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int which) {// TODO Auto-generated method stub//點擊確定轉向登陸框LayoutInflater factory = LayoutInflater.from(Examples_04_14Activity.this);//得到自訂對話方塊final View DialogView = factory.inflate(R.layout.dialog, null);AlertDialog dlg = new AlertDialog.Builder(Examples_04_14Activity.this).setTitle("登陸框").setView(DialogView)//設定自訂對話方塊的樣式.setPositiveButton("確定", //設定"確定"按鈕new DialogInterface.OnClickListener(){ //設定事件監聽 public void onClick(DialogInterface dialog, int whichButton) { //輸入完成後,點擊“確定”開始登陸 m_Dialog = ProgressDialog.show(Examples_04_14Activity.this, "請等待...", "正在為你登入...",true); new Thread(){ public void run(){ try{ sleep(3000); }catch (Exception e){ e.printStackTrace(); } finally{ //登入結束,取消m_Dialog對話方塊 m_Dialog.dismiss(); } } }.start(); } }) .setNegativeButton("取消", //設定“取消”按鈕 new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton){ //點擊"取消"按鈕之後退出程式 Examples_04_14Activity.this.finish(); } }) .create();//建立dlg.show();//顯示}}).setNeutralButton("退出", new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int whichButton){//點擊"退出"按鈕之後推出程式Examples_04_14Activity.this.finish();}}).create();//建立按鈕// 顯示對話方塊dialog.show();
【擴充點】
1. LayoutInflater factory = LayoutInflater.from(Activity01.this);
Inflater英文意思是膨脹。 LayoutInflater的作用類似於 findViewById(),不同點是LayoutInflater是用來找layout檔案夾下的xml布局檔案,並且執行個體化!而 findViewById()是找具體某一個xml下的具體 widget控制項(如:Button,TextView等)。
補充總結:
(1).一般來講,我們用LayoutInflater做一件事:inflate。inflate這個方法總共有四種形式,目的都是把xml表述的layout轉化為View。
(2).獲得LayoutInflater的方法三種:
LayoutInflater inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);View layout = inflater.inflate(R.layout.main, null);LayoutInflater inflater = LayoutInflater.from(context); (該方法實質就是第一種方法,可參考原始碼)View layout = inflater.inflate(R.layout.main, null);LayoutInflater inflater = getLayoutInflater();(在Activity中可以使用,實際上是View子類下window的一個函數)View layout = inflater.inflate(R.layout.main, null);
(3)setContentView和inflate的區別:
public class MyInflate extends Activity{private TextView tv;public void OnCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);//setContentView(R.layout.main);//tv = (TextView) findViewById(R.id.tv);LayoutInflater inflate = LayoutInflater.from(this);View view = inflate.inflate(R.layout.main,null);setContentView(view);}}
上述注釋掉的代碼和沒有注釋掉的代碼兩種情況是相同的。
區別:
setContentView()一旦調用, layout就會立刻顯示UI;而inflate只會把Layout形成一個以view類實現成的對象,有需要時再用setContentView(view)顯示出來。一般在activity中通過setContentView()將介面顯示出來,但是如果在非activity中如何對控制項布局設定作業了,這就需要LayoutInflater動態載入。
public View inflate(int Resourece,ViewGroup root)
作用:填充一個新的視圖階層從指定的XML資源檔中
reSource:View的layout的ID
root: 產生的階層的根視圖
return 填充的階層的根視圖。如果參數root提供了,那麼root就是根視圖;否則填充的XML檔案的根就是根視圖。
其餘幾個重載的inflate函數類似。
該區別引用自:http://www.cnblogs.com/sanjinxiong/articles/2125142.html
2. AlertDialog.Builder()的使用
AlertDialog是Dialog的一個直接子類,AlertDialog也是Android系統當中最常用的對話方塊之一。
一個AlertDialog可以有兩個以上的Button,可以對一個AlertDialog設定相應的資訊。比如title,massage,setSingleChoiceItems,setPositiveButton,setNegativeButton等等。。。。
但不能直接通過AlertDialog的建構函式來生產一個AlertDialog。研究AlertDialog的源碼發現AlertDialog所有的構造方法都是防寫保護的所以不能通過:AlertDialog alertDialog = new AlertDialog();來得到。只能通過:
AlertDialog.Builder alertDialog =new AlertDialog.Builder(this);
四、 圖片視圖(imageView)
針對imageVIew對象,通過setImageResource()方法設定要顯示圖片的資源索引。
執行個體分析:實現imageView對象,Alpha值的遞減。
關鍵源碼:
public class Activity01 extends Activity{ImageViewimageview;//聲明ImageView對象TextViewtextview;intimage_alpha= 255; //ImageView的alpha值,HandlermHandler= new Handler();booleanisrung= false; //控制項線程public void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);isrung= true;//獲得ImageView的對象imageview = (ImageView) this.findViewById(R.id.ImageView01);textview = (TextView) this.findViewById(R.id.TextView01);//設定imageview的圖片資源。同樣可以再xml布局中像下面這樣寫//android:src="@drawable/logo"imageview.setImageResource(R.drawable.logo);//設定imageview的Alpha值imageview.setAlpha(image_alpha);//開啟一個線程來讓Alpha值遞減new Thread(new Runnable() {public void run(){while (isrung){try{Thread.sleep(200);//更新Alpha值updateAlpha();}catch (InterruptedException e){e.printStackTrace();}}}}).start();//接受訊息之後更新imageview視圖mHandler = new Handler() {@Overridepublic void handleMessage(Message msg){super.handleMessage(msg);imageview.setAlpha(image_alpha);textview.setText("現在alpha值是:"+Integer.toString(image_alpha));//更新imageview.invalidate();}};}public void updateAlpha(){if (image_alpha - 7 >= 0){image_alpha -= 7;}else{image_alpha = 0;isrung = false;}//發送需要更新imageview視圖的訊息mHandler.sendMessage(mHandler.obtainMessage());}}
【擴充點】Handler的使用
handler類允許你發送訊息和處理線程訊息佇列中的訊息及runnable對象。handler執行個體都是與一個線程和該線程的訊息佇列一起使用,一旦建立了一個新的handler執行個體,系統就把該執行個體與一個線程和該線程的訊息佇列捆綁起來,這將可以發送訊息和runnable對象給該訊息佇列,並在訊息佇列出口處處理它們。
handler類有兩種主要用途:1。按照時間計劃,在未來某時刻,對處理一個訊息或執行某個runnable執行個體。2。把一個對另外線程對象的操作請求放入訊息佇列中,從而避免線程間衝突。
時間類訊息通過如下方法使用: post(Runnable), postAtTime(Runnable, long), postDelayed(Runnable, long), sendEmptyMessage(int), sendMessage(Message), sendMessageAtTime(Message, long), and sendMessageDelayed(Message, long)
methods. post之類函數可以傳輸一個runnable對象給訊息佇列,並在到達訊息佇列後被調用。sendmessage之類函數可以傳送一個包含資料的message對象,該message對象可以被Handler類的handleMessage(Message) 方法所處理。
post之類函數和sendmessage之類的函數都可以指定訊息的執行時機,是立即執行、稍後一段時間執行,還是在某個確定時刻執行。這可以用來實現逾時、訊息或其他時間相關的操作。
當一個進程啟動時,主線程獨立執行一個訊息佇列,該隊列管理著應用頂層的對象(如:activities、broadcast receivers等等)和所有建立的視窗。你可以建立自己的一個線程,並通過handler來與主線程進行通訊。這可以通過在新的線程中調用主線程的handler的post和sendmessage操作來實現。
一、圖片按鈕(ImageButton)
ImageButton對象通過setImageDrawable()方法設定顯示圖片。
基礎控制項差不多就學習到這裡了,下面是一些效果的實現。
學習到P92頁