Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3516919
  • 博文数量: 864
  • 博客积分: 14125
  • 博客等级: 上将
  • 技术积分: 10634
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-27 16:53
个人简介

https://github.com/zytc2009/BigTeam_learning

文章分类

全部博文(864)

文章存档

2023年(1)

2021年(1)

2019年(3)

2018年(1)

2017年(10)

2015年(3)

2014年(8)

2013年(3)

2012年(69)

2011年(103)

2010年(357)

2009年(283)

2008年(22)

分类: Java

2010-10-19 13:27:22

AndroidManifest.xml 是一個用來描述 Android 應用程式「整體資訊」的設定檔。簡單來說,這是一個「自我介紹」檔,我們可以向 Android 系統「介紹」我們的 Android 應用程式,以便讓 Android 系統完整地了解我們的應用程式資訊。

在 [教 學, #9] 中,我們提及:「在這裡修改 AndroidManifest.xml 的目的是為了『在我們的 Android 應用程式裡加入一個 Service 類別』,這樣才有辦法啟動 Service...」這個工作的目的是為了向 Android 系統做二項自我介紹。說明如下。

1. 應用程式「實作了一個 MokoService 類別」

    
...

...

...

在 application 標籤裡加入 ‘service’ 標籤,告訴 Android 系統我們的應用程式有一個叫做「MokoService」的類別。「android:name」屬性用來指定 Service 的類別名稱,別忘了在 AndroidManifest.xml 裡,類別名稱都是以「.」(小數點)開始。

2. MokoService 類別可處理「com.moko.hello.START_MUSIC」意圖

       




在 service 標籤裡加入 ‘intent-filter’ 標籤,告訴 Android 系統我們的應用程式可「濾出」哪一個「Intent」。在前面的教學裡,我們把 Intent 暫時解釋為 Event(事件);因此,這裡的「自我介紹」用意是為了告訴 Android 系統,我們可接受的事件名稱為何。

我們只要在 intent-filter 標籤裡加入 ‘action’ 標籤,並指定 action 標籤的 android:name 屬性即可。Intent 的命名規則為「xxx.yyy.NAME」的路徑命名法。

當 Android 收到由 Activity 發出的 Intent 後,便去找尋可處理 com.moko.hello.START_MUSIC 的類別,然後載入並啟動此類別。

最後,在 ’intent-filter’ 裡加入 ‘category’ 標籤,用來定義 com.moko.hello.START_MUSIC 的分類,在這裡指定為預設類別 「android.intent.category.DEFAULT」,這是一個 Android 定義的常數。完整的 Service 類別「自我介紹」標籤與屬性,可參考 Android SDK 的說明。

Android應用程式的UI可以使用XML來定義,這個部份在前面的教學裡介紹 過。要定義Android應用程式的選單,我們同樣可以使用XML來做描述,請看以下的說明。

建立 Menu 步驟

1. 建立選單的XML檔

在Android專案的res/目錄下新增一個menu/子目錄,然後建立options_menu.xml文件。

menu-1.png

圖1: 建立menu/目錄

menu-2.png

圖2: 建立options_menu.xml文件

2. 以XML定義選單內容

在options_menu.xml檔案裡,定義我們想要的選單內容。以下是一個範例:


android:title="New Message" />
android:title="Quit" />

3. 將選單加入應用程式

要如何在應用程式啟動時加入我們定義好的選單呢?在onCreateOptionsMenu()事件裡以MenuInflater類別將定義好的選 單加入應用程式:

public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.options_menu, menu);
return true;
}

在這個範例裡,我們使用到二個類別:Menu與MenuInflater,因此記得import這二個套件:

import android.view.Menu;
import android.view.MenuInflater;
執行結果

按下手機上的Menu鍵後,出現我們所設計的選單,如圖3。

menu-3.png

圖3: HelloMenu範例的選單畫面

處理選單

最後一個問題是,當使用者觸壓選單上的選項時,Android應用程式要如何處理?方法是透過onOptionsItemSelected()事 件:

    public boolean onOptionsItemSelected(MenuItem item) {
return true;
}

當此事件被回呼時,Android框架傳入被觸壓的選項物件,其類別為MenuItem;請import此套件:

import android.view.MenuItem;

前述的教學提到,Android應用程式編譯時,會自動產生R類別,即描述UI的類別。我們所定義的選單UI也會被放到R類別裡,如下:

package com.moko.hellomenu;

public final class R {
public static final class attr {
}
public static final class drawable {
public static final int icon=0x7f020000;
}
public static final class id {
public static final int new_message=0x7f060000;
public static final int quit=0x7f060001;
}

public static final class layout {
public static final int main=0x7f030000;
}
public static final class menu {
public static final int options_menu=0x7f050000;
}
public static final class string {
public static final int app_name=0x7f040001;
public static final int hello=0x7f040000;
}
}

以下是處理MenuItem的程式範例:

    public boolean onOptionsItemSelected(MenuItem item) {
int item_id = item.getItemId();

switch (item_id){
case R.id.new_message: break;
case R.id.quit: break;
default: return false;
}
return true;
}

呼叫MenuItem的getItemId()方法,可取得該選項的ID,如此一來便能得知使用者所觸壓的選項。

完整程式列表
/* 範例檔名:HelloMenu.java */
package com.moko.hellomenu;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;


public class HelloMenu extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}

public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.options_menu, menu);
return true;
}


public boolean onOptionsItemSelected(MenuItem item) {
int item_id = item.getItemId();

switch (item_id){
case R.id.new_message: break;
case R.id.quit: break;
default: return false;
}
return true;
}
}
阅读(856) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~