Android 學習筆記五:支援不同的裝置

lihongxun945發表於2015-10-07

這裡所說的不同裝置包括兩種不同:作業系統語言,以及螢幕大小和畫素密度。

國際化

適應不同的作業系統語言,即平時說的 i18n(internationalization),即國際化。我們這裡只討論最簡單的一種情況,就是對不同的系統顯示對應語言的文案,其實還有更多的包括對其方式、操作習慣等就不考慮了。

前面講到過,不要在程式碼中寫死文案,所有文案相關的字串都應該寫在 strings.xml 中。這樣做國際化就簡單很多,只需要再新建一個 values-xxx 檔案,並在裡面放上一個 strings.xml 檔案即可。當安卓應用啟動的時候會自動選擇對應的語言,如果沒有則會自動降級到 values 。比如 如果定義了一個 values-zh/strings.xml,那麼當作業系統為中文的時候就會自動載入這個檔案中的值。而且 strings.xml 裡面的寫法完全一樣。

現在建立一個 values-zh/strings.xml 檔案,並且在裡面寫上如下程式碼:

<resources>
    <string name="app_name">測試應用</string>

    <string name="action_settings">設定</string>
    <string name="title">標題</string>
    <string name="button_login">登入</string>
    <string name="username_hint">輸入賬號</string>
    <string name="username_label">賬號</string>
    <string name="password_hint">輸入密碼</string>
    <string name="password_label">密碼</string>
    <string name="title_activity_profile">首頁</string>

    <string name="hello_world">你好!</string>
    <string name="action_search">搜尋</string>
</resources>

然後把 values/strings.xml 裡面的字串都改成英文:

<resources>
    <string name="app_name">HelloWorld</string>

    <string name="action_settings">Settings</string>
    <string name="title">title</string>
    <string name="button_login">login</string>
    <string name="username_hint">username</string>
    <string name="username_label">username</string>
    <string name="password_hint">password</string>
    <string name="password_label">password</string>
    <string name="title_activity_profile">ProfileActivity</string>

    <string name="hello_world">Hello world!</string>
    <string name="action_search">search</string>
</resources>

然後執行,在模擬器中設定不同的語言試試。

適應不同的螢幕大小和畫素密度

螢幕大小是指螢幕的高度和寬度,而畫素密度指的是多少個物理畫素來顯示一個邏輯畫素。和上面的國際化幾乎一樣的,都是通過增加不同的資原始檔來實現適應不同的螢幕。
如果你的應用支援橫屏的話,橫屏其實是被當做了另一種螢幕尺寸的。

下面我們來修改一下 MainActivity ,做一個簡單的改動,讓他在大螢幕上是水平排列的,而在小螢幕上是垂直排列的。
res 下面新建一個 layout-large/activity_main.xml 檔案,把原來的 activity_main.xml 複製到這裡來,需要對 layout-large/activity_main.xml 進行一些修改:

  • android:orientation=“vertical” 改成 android:orientation=”horizontal”
  • 把裡面的幾個元件全部改成 android:layout_width=“wrap_content”,不然寬度太寬之後會把後面的寄到螢幕外

修改之後的程式碼如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"
    android:orientation="horizontal">

    <TextView android:text="@string/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
    <EditText
        android:id="@+id/username"
        style="@style/EditTextStyle"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:drawableLeft="@drawable/ic_phone"
        android:drawableStart="@drawable/ic_phone"
        android:hint="@string/username_hint"
        android:imeActionId="@+id/username"
        android:imeOptions="actionUnspecified"
        android:inputType="text"/>

    <EditText
        android:id="@+id/password"
        style="@style/EditTextStyle"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:drawableLeft="@drawable/ic_lock"
        android:drawableStart="@drawable/ic_lock"
        android:hint="@string/password_hint"
        android:imeActionId="@+id/password"
        android:imeOptions="actionUnspecified"
        android:inputType="textPassword"/>

    <Button
        android:id="@+id/button_login"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/button_login"
        />

</LinearLayout>

然後執行,在不同的模擬器上會看到有不同的佈局。

對不同畫素密度的裝置也是同樣的方式,只需要建立 drawable-h/ 之類的資料夾,並且在裡面放上對應的圖片就行了。

相關文章