more: Jollen 的 Embedded Linux 教育訓練

June 21, 2009

Jollen 的 Android 教學,#18: 佈景(Theme)初體驗

上一節提到佈景(theme)是可以大範圍套用的UI美化功能,其套用範圍為「整個螢幕」,從程式碼的角度來看,佈景可以套用到以下二個範圍:

  • 整個應用程式(application)
  • 整個activity

接下來,我們以一個很簡單的例子,來說明如何套用佈景到application。在一些應用,我們可能不想要顯示視窗標題(title),怎麼做出這個功能呢?利用佈景設定的方式即可達成。以下是實作方法。

在styles.xml裡加入以下內容:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="myTheme">
    	<item name="android:windowNoTitle">true        
    </style> 
</resources>

修改AndroidManifest.xml,在標籤裡加上「theme」屬性:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.moko.hellotheme"
      android:versionCode="1"
      android:versionName="1.0.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name"
    	android:theme="@style/myTheme">
        <activity android:name=".HelloTheme"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

執行結果:

theme-1.png
圖1: HelloTheme的執行結果

在這個範例裡,我們並沒有修改任何的程式碼,其原理是透過佈景設定的方法。定義佈景的方式與定義樣式(styles)相同,同樣是在styles.xml裡以<item>標籤來定義。

以下是使用HelloTheme的說明:

1. <item>的name屬性為android:windowNoTitle時,表示定義是否要顯示視窗標題,在此設定為true,表示不要有視窗標題
2. 在<application>標籤裡加上theme屬性,將佈景套用到應用程式

佈景除了能套用到應用程式外,也能套用到activity。如何套用佈景到activity呢?只要在<activity>裡加入theme屬性即可,做法與<application>相同。

June 20, 2009

Jollen 的 Android 教學,#17: 樣式設計(Styles)初體驗

在這篇教學裡,我們將用一個非常簡單的範例來初步體驗Android的「styles」功能。

什麼是樣式(Styles)?

Android的樣式設計(style)是一個很重要的功能,因為它可以讓應用程式裡的元件(widget)「長」得跟別人很不一樣。樣式設計的使用規定如下:

  • 在Android專案裡以XML資源檔來定義「樣式」
  • 一個Android專案可以定義多個樣式
  • 讓widget套用其中一個樣式

Android的styles功能,主要的對象是widget,樣式是為了套用到widget上;另外Android還提供佈景(theme)功能,可以做更大範圍的套用。

如何定義樣式

定義樣式的方式如下:

1. 在Android專案的「res/values」資料夾裡建立styles.xml樣式定義檔。如圖1。

styles-1.png
圖1: 建立styles.xml

2.在styles.xml裡定義樣式,以下是一個範例:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="myText">
        <item name="android:textSize">18sp</item>
        <item name="android:textColor">#880</item>
    </style>
</resources>

styles.xml的寫法說明如下:

1. 在 <resource>標籤裡定義資源項目, <style>標籤用來定義樣式資源
2. <style>的name屬性定義此樣式的名字,widget使用此名字以套用樣式
3. <item>標籤定義此樣式的內容
4. <item>的name屬性為android:textSize時,表示定義此樣式的字體大小,在此設定字體大小為18sp
5. <item>的name屬性為android:textColor時,表示定義此樣式的字體顏色,在此設定字體顏色為#880(RGB)
6. 更多的樣式屬性,請參考Android Reference

定義好樣式後,就可以讓widget套用樣式。

Widget如何套用樣式

如何讓widget套用上述定義的「myText」樣式,方法很簡單。還記得UI layout檔main.xml嗎?只要在widget的項目裡,加上style屬性,並指定樣式名稱即可。以下是HelloStyles範例:

<?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
 <TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="Hello, this is HelloStyles."
    style="@style/myText"
    />
 </LinearLayout>

「@style/myText」表示要指定一個style的名稱,此名稱為myText。

執行結果:

styles-2.png
圖2: HelloStyles的執行畫面

June 18, 2009

Jollen 的 Android 教學,#16: Event Listener的用法: 以Click Listener為例

Event Listener的用法: 以Click Listener為例

以Android所提供的View.OnClickListener來說明程式實作方法。一個較為良好的實作方法是在我們的Acitivty類別裡實作View.OnClickListener介面,即:

import android.view.View;
  
public class HelloClickListener extends Activity implements View.OnClickListener {
   ...
}

每一個View都可以註冊一個event listener,當Android框架收到「click」事件後,便回呼event listener的callback method。以Button類別(按鈕元件)為例,當我們想要處理使用者觸控按鈕的事件時,就要呼叫Button類別的setOnClickListener()方法來註冊click listener。上述的實作方方法是,直接在我們的Activity類別HelloClickListener裡實作View.OnClickListener,因此上述Button類別的click listener為「this」。

上述的實作觀念,可用圖1來表示。

HelloClickListener.png
圖1: HelloClickListener類別實作View.OnClickListener介面

註冊click listener的程式碼如下:

   public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        Button button = (Button)findViewById(R.id.btn);
        button.setOnClickListener(this);
    }

在onCreate()裡先找到Button元件,它的click listener為this為,接著在我們的Activity類別裡實作onClick()。onClick()方法的程式碼如下,我們以Toast類別來回應訊息給使用者:

   public void onClick(View v) {
        Toast.makeText(
                this,
                "Yes.",
                Toast.LENGTH_LONG).show();  
    }

完整程式碼: HelloClickListener.java

package com.moko.helloclicklistener;
   
import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.Toast;
import android.view.View;
   
public class HelloClickListener extends Activity implements View.OnClickListener {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        Button button = (Button)findViewById(R.id.btn);
        button.setOnClickListener(this);
    }
    
    public void onClick(View v) {
        Toast.makeText(
                this,
                "Yes.",
                Toast.LENGTH_LONG).show();  
    }
}

執行結果

clicklistener-1.png
圖2: HelloClickListener的執行結果

當使用者觸碰畫面上的按鈕時,便以Toast類別在畫面上顯示「Yes」。

Jollen 的 Android 教學,#15: 什麼是事件監聽器(Event Listener)?

學會產生基本的UI後,接著就要學習UI的事件處理(UI Events),才能讓UI與使用者「互動」。

什麼是事件監聽器(Event Listener)

UI的使用者事件處理,即View如何處理使用者的操作,是一個重要的課題。View是重要的類別,它是與使用者互動的前線;在Android框架的設計中,以事件監聽器(event listener)的方式來處理UI的使用者事件。

Android框架提供了非常良好的UI事件處理機制。先前的教學提到,View是繪製UI的類別,每個View物件都可以向Android框架註冊一個事件監聽器。每個事件監聽器都包含一個回呼函數(callback method),

這個回呼函數(callback method)主要的工作就是回應或處理使用者的操作。

Event Listener: 以Click Listener為例

以「使用者觸碰(touch)」的動作來說,當View要處理使用者觸碰的事件時,就要向Android框架註冊View.OnClickListener事件監聽器;當「touch」事件發生時,Android框架便回呼事件監聽器裡的回呼函數。

View.OnClickListener是click listener,故名思意,這是UI的「Click動作監聽器」;當使用者對View進行Click操作時(即觸控畫面上的UI元件),Android框架便會回呼這個View.OnClickListener的回呼函數。

View.OnClickListerner的回呼函數為OnClick()。

這裡所提到的監聽器泛指event listener,主要用來「監聽」使用者的各種動作。除了View.OnClickListener外,Android框架還有以下的event listener(及其callback method):

  • View.OnLongClickListener: onLongClick()
  • View.OnFocusChangeListener: onFocusChange()
  • View.OnKeyListener: onKey()
  • View.OnTouchListener: onTouch()
  • View.OnCreateContextMenuListener: onCreateContextMenu()

另外一種處理UI事件的機制為事件處理器(event handler),event handler與event listener是不一樣的二種處理機制。在自訂Android component的教學裡,再介紹這個部份。

June 17, 2009

Garmin-Asus的nuvifone G60改用Android作業系統

CNET ASIA上的一則報導[Android to replace Garmin-Asus' current Linux platform]指出,Garmin-Asus的nuvifone G60將改採Android作業系統

nuvifone-g60.jpg
(圖片來源:CNET)

2009年二月,Garmin與Asus正式宣佈策略聯盟,並以「Garmin-Asus」雙品牌策略進行行銷。nuvifone G60是Garmin-Asus雙品牌行銷策略下的第一個產物,nuvifone G60則是以導航功能為主軸的手機。

根據報導指出,Garmin-Asus現有的Linux平臺將只使用在G60裝置上,未來的裝置會採用Windows Mobile或者是Android作業系統。

如同Garmin的PND產品都是採用Linux作業系統一樣,原本nuvifone G60也計畫採用Linux作業系統,不久前,在engadget上的報導也出現實機照片;但是,隨著CNET這則報導的出現,整個開發計畫是否有了改變,頗令人好奇。

Android原本就對Google Map有很好的支援,再加上nuvifone G60是以導航以及地圖應用為主的手機,若是改採Android作業系統,也是一個合理的做法。

* Update: 2009/6/19

Top | 授權條款 | Jollen's Forum: Blog 評論、討論與搜尋
Copyright(c) 2006 www.jollen.org