【android基礎學習之五】——基礎控制項Menu,Dialog,ImageView,ImageButton

來源:互聯網
上載者:User

  聲明:學習的書籍《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頁

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.