一、 按鈕(Button)
按鈕控件已經(jīng)在之前的例子學(xué)習(xí)中使用到,主要的是一個(gè)setOnClickListener事件。
二、 菜單(Menu)
一般 Android手機(jī)都有menu這個(gè)按鍵來顯示相應(yīng)的菜單,實(shí)現(xiàn)菜單效果,需要通過onCreateOptionsMenu來實(shí)現(xiàn),然后對(duì)其事件進(jìn)行相關(guān)的監(jiān)聽來實(shí)現(xiàn)不同任務(wù),可以通過兩種方式來實(shí)現(xiàn):
1. 通過XML布局實(shí)現(xiàn);
2. 通過Menu.add方法實(shí)現(xiàn)
實(shí)例分析:通過上面兩種方式來實(shí)現(xiàn)菜單效果,main.xml使用XML布局方式實(shí)現(xiàn),main2.xml使用Menu.add方法實(shí)現(xiàn)。
1. 通過XML布局:
首先需要在res目錄下建立menu文件夾,并且在該目錄下建立menu.xml文件,在該文件中創(chuàng)建需要的菜單。
- <menu xmlns:android="http://schemas./apk/res/android">
- <item android:id="@+id/about" android:title="關(guān)于"/>
- <item android:id="@+id/exit" android:title="退出"/>
- </menu>
然后對(duì)應(yīng)的Activity01重寫onCreateOptionsMenu方法來裝載這個(gè)menu文件
-
- public boolean onCreateOptionsMenu(Menu menu) {
- MenuInflater inflater = this.getMenuInflater();
-
- inflater.inflate(R.menu.menu, menu);
- return true;
- }
最后可以加上對(duì)菜單按鈕事件的監(jiān)聽
-
- public boolean onOptionsItemSelected(MenuItem item) {
-
-
- int item_id = item.getItemId();
-
- switch(item_id){
- case R.id.about:
-
- Intent intent = new Intent();
-
- intent.setClass(Examples_04_13Activity.this, Examples_04_13Activity02.class);
-
- startActivity(intent);
-
- Examples_04_13Activity.this.finish();
- break;
- case R.id.exit:
- Examples_04_13Activity.this.finish();
- break;
- }
- return true;
- }
【擴(kuò)展點(diǎn)】:關(guān)于Intent的理解與使用
Intent 是一個(gè)將要執(zhí)行的動(dòng)作的抽象的描述,一般來說是作為參數(shù)來使用,由Intent來協(xié)助完成android各個(gè)組件之間的通訊。比如說調(diào)用startActivity()來啟動(dòng)一個(gè)activity,或者由broadcaseIntent()來傳遞給所有感興趣的BroadcaseReceiver, 再或者由startService()/bindservice()來啟動(dòng)一個(gè)后臺(tái)的service.所以可以看出來,intent主要是用來啟動(dòng)其他的activity 或者service,所以可以將intent理解成activity之間的粘合劑。
可以參考該文章http://wenku.baidu.com/view/76db47858762caaedd33d452.html
2 通過Menu.add方法:
即在onCreateOptionsMenu方法中通過menu.add方法進(jìn)行添加,如;
- public boolean onCreateOptionsMenu(Menu menu) {
-
- menu.add(0, 0, 0, R.string.ok);
- menu.add(0, 0, 1, R.string.back);
- return true;
- }
實(shí)例效果:左圖為第一種實(shí)現(xiàn)方式,右圖為第二種實(shí)現(xiàn)方式
三、 對(duì)話框(Dialog)
實(shí)現(xiàn)對(duì)話框效果,主要是使用AlertDialog.Builder類,還可以自定義對(duì)話框。
實(shí)例關(guān)鍵源碼分析:
- Dialog dialog = new AlertDialog.Builder(Examples_04_14Activity.this)
- .setTitle("登陸提示")
- .setMessage("這里需要登陸!")
- .setPositiveButton("確定",
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
-
-
- 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,
- "請(qǐng)等待...", "正在為你登錄...",true);
-
- new Thread(){
- public void run(){
- try{
- sleep(3000);
- }catch (Exception e){
- e.printStackTrace();
- }
- finally{
-
- 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();
【擴(kuò)展點(diǎn)】
1. LayoutInflater factory = LayoutInflater.from(Activity01.this);
Inflater英文意思是膨脹。 LayoutInflater的作用類似于 findViewById(),不同點(diǎn)是LayoutInflater是用來找layout文件夾下的xml布局文件,并且實(shí)例化!而 findViewById()是找具體某一個(gè)xml下的具體 widget控件(如:Button,TextView等)。
補(bǔ)充總結(jié):
(1).一般來講,我們用LayoutInflater做一件事:inflate。inflate這個(gè)方法總共有四種形式,目的都是把xml表述的layout轉(zhuǎn)化為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); (該方法實(shí)質(zhì)就是第一種方法,可參考源代碼)
- View layout = inflater.inflate(R.layout.main, null);
-
- LayoutInflater inflater = getLayoutInflater();(在Activity中可以使用,實(shí)際上是View子類下window的一個(gè)函數(shù))
- View layout = inflater.inflate(R.layout.main, null);
(3)setContentView和inflate的區(qū)別:
- public class MyInflate extends Activity{
- private TextView tv;
- public void OnCreate(Bundle savedInstanceState){
- super.onCreate(savedInstanceState);
-
-
-
- LayoutInflater inflate = LayoutInflater.from(this);
- View view = inflate.inflate(R.layout.main,null);
- setContentView(view);
- }
- }
上述注釋掉的代碼和沒有注釋掉的代碼兩種情況是相同的。
區(qū)別:
setContentView()一旦調(diào)用, layout就會(huì)立刻顯示UI;而inflate只會(huì)把Layout形成一個(gè)以view類實(shí)現(xiàn)成的對(duì)象,有需要時(shí)再用setContentView(view)顯示出來。一般在activity中通過setContentView()將界面顯示出來,但是如果在非activity中如何對(duì)控件布局設(shè)置操作了,這就需要LayoutInflater動(dòng)態(tài)加載。
public View inflate(int Resourece,ViewGroup root)
作用:填充一個(gè)新的視圖層次結(jié)構(gòu)從指定的XML資源文件中
reSource:View的layout的ID
root: 生成的層次結(jié)構(gòu)的根視圖
return 填充的層次結(jié)構(gòu)的根視圖。如果參數(shù)root提供了,那么root就是根視圖;否則填充的XML文件的根就是根視圖。
其余幾個(gè)重載的inflate函數(shù)類似。
該區(qū)別引用自:http://www.cnblogs.com/sanjinxiong/articles/2125142.html
2. AlertDialog.Builder()的使用
AlertDialog是Dialog的一個(gè)直接子類,AlertDialog也是Android系統(tǒng)當(dāng)中最常用的對(duì)話框之一。
一個(gè)AlertDialog可以有兩個(gè)以上的Button,可以對(duì)一個(gè)AlertDialog設(shè)置相應(yīng)的信息。比如title,massage,setSingleChoiceItems,setPositiveButton,setNegativeButton等等。。。。
但不能直接通過AlertDialog的構(gòu)造函數(shù)來生產(chǎn)一個(gè)AlertDialog。研究AlertDialog的源碼發(fā)現(xiàn)AlertDialog所有的構(gòu)造方法都是寫保護(hù)的所以不能通過:AlertDialog alertDialog = new AlertDialog();來得到。只能通過:
AlertDialog.Builder alertDialog =new AlertDialog.Builder(this);
四、 圖片視圖(imageView)
針對(duì)imageVIew對(duì)象,通過setImageResource()方法設(shè)置要顯示圖片的資源索引。
實(shí)例分析:實(shí)現(xiàn)imageView對(duì)象,Alpha值的遞減。
關(guān)鍵源碼:
- public class Activity01 extends Activity{
- ImageView imageview;
- TextView textview;
- int image_alpha = 255;
- Handler mHandler = new Handler();
- boolean isrung = false;
-
- public void onCreate(Bundle savedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- isrung = true;
-
- imageview = (ImageView) this.findViewById(R.id.ImageView01);
- textview = (TextView) this.findViewById(R.id.TextView01);
-
-
-
- imageview.setImageResource(R.drawable.logo);
-
-
- imageview.setAlpha(image_alpha);
-
-
- new Thread(new Runnable() {
- public void run(){
- while (isrung){
- try{
- Thread.sleep(200);
-
- updateAlpha();
- }catch (InterruptedException e){
- e.printStackTrace();
- }
- }
- }
- }).start();
-
-
- mHandler = new Handler() {
- @Override
- public void handleMessage(Message msg){
- super.handleMessage(msg);
- imageview.setAlpha(image_alpha);
- textview.setText("現(xiàn)在alpha值是:"+Integer.toString(image_alpha));
-
- imageview.invalidate();
- }
- };
- }
-
- public void updateAlpha(){
- if (image_alpha - 7 >= 0){
- image_alpha -= 7;
- }else{
- image_alpha = 0;
- isrung = false;
- }
-
- mHandler.sendMessage(mHandler.obtainMessage());
- }
- }
【擴(kuò)展點(diǎn)】Handler的使用
handler類允許你發(fā)送消息和處理線程消息隊(duì)列中的消息及runnable對(duì)象。handler實(shí)例都是與一個(gè)線程和該線程的消息隊(duì)列一起使用,一旦創(chuàng)建了一個(gè)新的handler實(shí)例,系統(tǒng)就把該實(shí)例與一個(gè)線程和該線程的消息隊(duì)列捆綁起來,這將可以發(fā)送消息和runnable對(duì)象給該消息隊(duì)列,并在消息隊(duì)列出口處處理它們。
handler類有兩種主要用途:1。按照時(shí)間計(jì)劃,在未來某時(shí)刻,對(duì)處理一個(gè)消息或執(zhí)行某個(gè)runnable實(shí)例。2。把一個(gè)對(duì)另外線程對(duì)象的操作請(qǐng)求放入消息隊(duì)列中,從而避免線程間沖突。
時(shí)間類消息通過如下方法使用: post(Runnable), postAtTime(Runnable, long), postDelayed(Runnable, long), sendEmptyMessage(int), sendMessage(Message), sendMessageAtTime(Message, long), and sendMessageDelayed(Message, long)
methods. post之類函數(shù)可以傳輸一個(gè)runnable對(duì)象給消息隊(duì)列,并在到達(dá)消息隊(duì)列后被調(diào)用。sendmessage之類函數(shù)可以傳送一個(gè)包含數(shù)據(jù)的message對(duì)象,該message對(duì)象可以被Handler類的handleMessage(Message) 方法所處理。
post之類函數(shù)和sendmessage之類的函數(shù)都可以指定消息的執(zhí)行時(shí)機(jī),是立即執(zhí)行、稍后一段時(shí)間執(zhí)行,還是在某個(gè)確定時(shí)刻執(zhí)行。這可以用來實(shí)現(xiàn)超時(shí)、消息或其他時(shí)間相關(guān)的操作。
當(dāng)一個(gè)進(jìn)程啟動(dòng)時(shí),主線程獨(dú)立執(zhí)行一個(gè)消息隊(duì)列,該隊(duì)列管理著應(yīng)用頂層的對(duì)象(如:activities、broadcast receivers等等)和所有創(chuàng)建的窗口。你可以創(chuàng)建自己的一個(gè)線程,并通過handler來與主線程進(jìn)行通信。這可以通過在新的線程中調(diào)用主線程的handler的post和sendmessage操作來實(shí)現(xiàn)。
一、圖片按鈕(ImageButton)
ImageButton對(duì)象通過setImageDrawable()方法設(shè)置顯示圖片。