第二部分:開發簡要指南-第五章 支持不同的Android設備


第5章 支持不同的Android設備

來自世界各地的Android設備在外表上看有許多形狀和大小。如此廣泛的設備類型,如果你能兼容不同的設備,那么你將為你的App獲得一批巨大的潛在用戶。為了讓你的App在Android設備上盡可能的成功,你需要適應各種設備的配置。這些不同設備中的重要變化就是不同的語言,屏幕大小,和系統版本。關於Android上App的適配,在第一大篇中我們曾講過基礎的理論,並且在“指南-第3章 Hello,本地化”中我們實踐過不同語言的支持。在以后的學習過程中,筆者會在適當的時候繼續慢慢深入Android的適配,請記住如果你要學精它,不是1,2篇文章就能搞定的。需要你的實踐與思考,所以我會循序漸進,不會一股腦的塞給讀者。本章內容是簡單而快速的實踐篇,讓你實踐我們第一大篇學過的知識。接下來看一下本章內容預覽:

1. 支持不同的語言

2. 支持不同的屏幕

3. 支持不同的系統版本

5.1 支持不同的語言

在你的應用程序中把UI字符串提取出來,放入一個外部的單獨文件中,這是一個很好的做法,在Android中我們很容易能做到這些。當我們使用Eclipse創建Android項目時,工具會自動生成 res/values/strings.xml這個文件。它就是本小節的主角。

5.1.1創建本地目錄和字符串文件

在“Hello,本地化”那章中我們不僅僅是處理的語言還處理的地區,當然本節我們只處理語言,處理地區是跟“drawable”相關的,現在讓我們遵循IOS639-1的標准創建values的后綴文件夾,例如values-es,表示使用語言代碼為es(西班牙)的本地語言環境,在運行時Android會根據你設備的本地設置來載入合適的資源。如果你的應用想支持幾種語言就可以新建對應的文件夾。例如如果我們需要支持西班牙語,法語,英語(默認)則應該如下所示:

MyProject/

    res/

       values/

           strings.xml

       values-es/

           strings.xml

       values-fr/

           strings.xml

這表示,當你的設備中語言的設置為法語或西班牙語的時候都會相應的顯示它們的語言,如果你的設備使用漢語的話,這里沒有支持,那么就會使用默認的英語,這三個文件中的代碼如下所示:

英語 (默認的語言環境),/values/strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="title">My Application</string>
    <string name="hello_world">Hello World!</string>
</resources>

 

西班牙語, /values-es/strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="title">Mi Aplicación</string>
    <string name="hello_world">Hola Mundo!</string>
</resources>

 

法語, /values-fr/strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="title">Ma Application</string>
    <string name="hello_world">Bonjour tout le Monde!</string>
</resources>

 

5.1.2使用字符串資源

讀者可以根據自己定義的<string>元素的name屬性,在你的源代碼中引用你的字符串資源。在源代碼中的使用語言為R.string.string_name。有幾種方法可以獲取到string.xml中的字符串。如代碼清單5-1所示

//在Activity下使用如下代碼可以獲取字符串資源
String hello = getResources().getString(R.string.hello_world);
//我們的TextView需要使用這個字符串資源來顯示文字,所以我們也可以直接使用R.string.hello_world 
TextView textView = new TextView(this);
textView.setText(R.string.hello_world);

 

代碼清單5-1

如果我們的TextView不是代碼生成的布局,而是已經放入布局中的xml中的話,我們可以像代碼清單5-2那樣使用

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/hello_world" />   

 

代碼清單5-2

5.2 支持不同的屏幕

Android設備在區分屏幕時使用兩個參數:大小(size)和密度(density),你應該想到你的App將被安裝到不同大小和密度的屏幕設備中,所以我們應該包括一些替代資源來為不同的屏幕優化程序的外觀。下面回顧我們屏幕的大小和密度有哪幾種。

大小:mall, normal, large, xlarge

密度:low (ldpi), medium (mdpi), high (hdpi), extra high (xhdpi)

關於以上這些名稱的數據范圍,以前講過了,這里就不科普了。你想要為不同屏幕使用相應的布局和位圖,就需要在不同的目錄中放入相應的資源,類似不同語言的字符串。另外要注意屏幕方向(橫豎屏切換)也是屏幕大小變化需要考慮的因素,所以很多應用需要在橫豎屏的切換中調整布局或使用新的布局來優化用戶體驗。

5.2.1創建不同的布局

為了在不同的屏幕大小中優化你的用戶體驗,你可以為每一個你想要支持的屏幕大小創建一個唯一的布局xml文件。每一個布局保存在合適的資源目錄,用”-<屏幕大小>”命名。例如,一個專門為large屏幕設計的布局應該保存在res/layout-large/下。為了正確的適應屏幕,Android會自動縮放你的布局。因此,我們不需要擔心其他不同屏幕大小下的布局元素的絕對尺寸,而是集中在影響用戶體驗的布局結構上。例如,以下工程包含一個默認的layout和一個可選擇性的large屏幕布局。

MyProject/

    res/

        layout/

            main.xml

        layout-large/

            main.xml

它們里面的文件名必須是是一樣的,但文件中的內容可以不一樣。我們代碼中使用的方法完全沒有改變,就像下面的代碼清單5-3一樣:

@Override
 protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);
}

 

代碼清單5-3

系統從適當的布局目錄中載入布局文件,它基於正在運行中設備的屏幕大小。下面在讓我們看一下指定支持橫向布局的例子:

MyProject/

    res/

        layout/

            main.xml

        layout-land/

            main.xml

默認的layout是用於豎屏的,所以這里我們等於分別支持了橫豎屏的布局。如果你想要同時支持多種情況的屏幕的話,你可以參考以下內容:

MyProject/

    res/

        layout/              # 默認 豎屏(portrait)

            main.xml

        layout-land/         # 橫屏(landscape)

            main.xml

        layout-large/        # large (portrait)

            main.xml

        layout-large-land/   # large (landscape)

            main.xml

注意:Android3.2和以上版本支持更高級的屏幕大小,允許指定基於最小寬度和最小高度的dip來指定資源。第一大篇我們簡單的介紹過,后面我們還會詳解,本章屬於新手指南為了簡單,暫不包含這項新技術。

5.2.2創建不同的位圖

你應該總是提供可供正確縮放位圖資源,記住!是為每一個密度:low,medium,high,extra-high。這可以幫你在所有屏幕密度下完成很好的圖形質量和性能。你可以再開始為每一個密度使用矢量圖來作為原始資源。或者能使用矢量圖的話就直接使用它,Android中能使用矢量圖的地方請千萬不要使用位圖。下面讓我們溫習一下密度換算,以前筆者在第一篇已經強調過了:

xhdpi: 2.0

hdpi: 1.5

mdpi: 1.0 (基線)

ldpi: 0.75

如果在xhdpi下是200x200px的圖像,其他密度下的大小為:150x150 (hdpi), 100x100 (mdpi),75x75 (ldpi)。這里請稍微花點時間思考下怎么來的。下面我們看下目錄結構:

MyProject/

    res/

        drawable-xhdpi/

            lam.png

        drawable-hdpi/

            lam.png

        drawable-mdpi/

            lam.png

        drawable-ldpi/

            lam.png

使用方法:在xml中 @drawable/lam代碼中R.drawable.lam。雖然理論上說我們需要支持所有密度,但實際情況下ldpi和xhdpi我們可以不需要考慮,原因是由於hdpi和ldpi是整數倍關系。xhdpi和mdpi也是整數倍關系,所以我們只支持mdpi和hdpi即可

5.3 支持不同的系統版本

雖然Android系統更新的很快,可能我們想使用新版的API,但我們應該繼續支持舊版的Android,這樣我們的應用才能在更多的設備上使用,本小節會告訴你在低版本的系統中如何使用新版的API。為了提供最好的功能和跨多個Android版本的函數,應該在我們的應用程序中使用Android Support Library(下一張講述它的用途),它允許您使用舊版本最近幾個平台API。

5.3.1指定最低的和目標API Level

AndroidManifest.xml文件描述了關於支持系統版本的細節。特別是mainSdkVersion和targetSdkVersion這兩個屬性,在uses-sdk節點中標識最低API level和最高API level。例如下面的代碼清單5-4:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" ... >
    <uses-sdk android:minSdkVersion="4" android:targetSdkVersion="15" />
    ...
</manifest>

 

代碼清單5-4

targetSdkVersion屬性可能用的人不多,由於android新版本的發布,一些風格和行為可能會改變,為了讓您的應用程序利用這些變化,並確保您的應用程序適合每個用戶的設備的風格,你應該設置thetargetSdkVersion值,以配合最新的Android版本。

5.3.2在運行時檢查系統版本

Android為每個系統版本提供一個唯一的代碼,這些代碼作為常量在Build類中。在App中可以使用這些常量來判斷運行中的系統版本是否符合你的要求,例如如代碼清單5-5所示,它們的用途

private void setUpActionBar() {
    // 確保程序執行的在Honeycomb(Android 3.0)版本或更好的系統版本中,才能使用ActionBar  APIs
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        ActionBar actionBar = getActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);
    }
}

 

代碼清單5-5

當解析XML資源時,Android會忽略當前設備不支持的屬性。所以你可以放心的使用新版本的XML屬性而無須擔心舊版本的問題。例如,如果你設置targetSdkVersion="11",你的App默認可以使用ActionBar,然后你為了添加菜單item到action bar中可能需要在你菜單資源XML中設置 android:showAsAction="ifRoom"。在跨版本的XML文件,它是安全的,因為舊版本的Android根本忽略showAsAction屬性(也就是說,你並不需要為v11的菜單單獨建立res/menu-v11/)。

5.3.3使用平台的風格和主題

Android提供主題的概念,它在操作系統下的外觀和感覺。這些主題可以用manifest文件應用到你的App。通過使用這些內置的風格和主題,你的應用程序會在不同的系統中,使用統一的外觀樣式。

使你的activity看起來像一個對話框:

<activity android:theme="@android:style/Theme.Dialog">

使你的activity 有一個透明/半透明的背景:

<activity android:theme="@android:style/Theme.Translucent">

為了應用你自己自定義的主題,需要在/res/values/styles.xml定義主題然后使用:

<activity android:theme="@style/CustomTheme">

為了應用一個主題要到你整個應用程序(所有activities),在<application>節點添加 android:theme :

<application android:theme="@style/CustomTheme">

風格和主題更詳細的使用方法我們會在后面的框架學習中講解。

本文來自jy02432443,QQ78117253。轉載請保留出處,並保留追究法律責任的權利


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM