Android 適配各國語言、屏幕尺寸、系統版本及常見適配方法總結

前言

全世界安卓智能手機語言不相同,因爲各廠家生產出的系統、屏幕也各異,隨着SDK不斷更新不一樣版本也有區別,android適配技能日益成爲必不可少的一項專業技能。根據網上的資料和我的經驗總結,整理一份目前比較完整的適配大全,有疏漏之處還望指正。android

1、適配國家語言

當用戶在智能手機系統「設置」選項中更改了各國語言,這時咱們須要在項目裏經過資源目錄實現適配語言。bash

咱們知道工程的根目錄有個res/的目錄,res/下有一個資源類型的目錄,其中有個values/strings.xml默認文件,在res/目錄下建立多個values/strings.xml文件,可是values目錄須要更名,例如:app

res/
       values/
           strings.xml
       values-es/
           strings.xml
       values-fr/
           strings.xml
複製代碼

其中,英語,/values/strings.xml:ide

<?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">Mon Application</string>
    <string name="hello_world">Bonjour le monde !</string>
</resources>
複製代碼

而後,咱們就能夠在代碼中使用R.string.<string_name>語法來引用字符串資源就好了。優化

2、屏幕適配

Android是用尺寸和分辨率這兩種常規屬性對設備加以分類。在咱們開發項目中應該提供一些可選資源,針對尺寸和分別率來優化咱們的界面外觀。ui

  • Layout適配有4種尺寸 :小(small),普通(normal),大(large),超大(xLarge)
  • Bitmap適配有4種分辨率:低Low精度(ldpi), 中Middle精度(mdpi),高High精度(hdpi), 超高精度(xhdpi)

首先,說一說這個分別率的問題。this

在項目開發的過程當中有一個重要的合做是與UI設計師的圖片大小分別率的溝通。例如,UI設計師實現步驟:①在coreldraw或者Sketch中製做好「矢量圖標「 ;②保存輸出爲「PNG位圖圖片」,單位是px;③設置圖標的內外邊距,此時的邊距單位是px;當開發者拿到圖後,會遇到這樣一個問題:內外邊距是由px爲單位的距離,可是在實際開發中「dp」作爲單位的更加常見,因此就會涉及到「px」「dp」互轉的問題。spa

對bitmap根據屏幕的分別率找到資源目錄下的密度文件夾。參考下表:

好比,計算方式給xhdpi(2倍圖,超高精度)級別的設備生成了一張200200px的圖像,那麼應該爲hdpi生成150150px,爲mdpi生成100100px, 爲ldpi生成7575px的圖片資源。而後,將這些文件放入相應的drawable資源目錄中:

MyProject/
    res/
        drawable-xhdpi/
            awesomeimage.png
        drawable-hdpi/
            awesomeimage.png
        drawable-mdpi/
            awesomeimage.png
        drawable-ldpi/
            awesomeimage.png
複製代碼

任什麼時候候,當引用@drawable/awesomeimage時系統會根據屏幕的分辨率選擇恰當的bitmap。

另外,解釋一下爲何上面表格有兩行標位紅色,緣由是2倍圖和3倍圖是主流佔比,在友盟統計中顯示以下:

其次,說一說這個XML佈局文件的適配。

實際開發時,咱們在xml佈局裏設置控件的寬高屬性都是以「dp」作爲單位,甚至還會遇到橫豎屏頁面適配狀況。前面提到了Layout適配尺寸有4種:小(small),普通(normal),大(large),超大(xLarge)

因此,咱們能夠在資源文件Layout根目錄建立不一樣尺寸的目錄,系統會根據app所運行的設備屏幕尺寸,在與之對應的layout目錄中加載layout。更多詳見Providing Resources。例如:

res/
        layout/
            main.xml
        layout-large/
            main.xml
複製代碼

Xml文件的名字相同。爲不一樣屏幕作不一樣UI處理,內容不一樣。如日常同樣在APP中引用:

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

*記得在AndroidManifest.xml文件中設置多分辨率支持:

<Supports-screens
 android:largeScreens="true"
 android:normalScreen="true"
 android:anyDensity="true"  
 android:smalleScreen="true"/>
複製代碼

最後,說一說橫豎屏佈局兼容的問題。

先看下面一個例子:這一個工程中適配橫向屏幕的layout-land

MyProject/
    res/
        layout/
            main.xml
        layout-land/
            main.xml
複製代碼

默認的layout/main.xml文件用做豎屏的layout。

若是想給橫屏提供適配於大屏幕,那麼則須要使用large和land修飾符。

MyProject/
    res/
        layout/              # default (portrait)
            main.xml
        layout-land/         # landscape
            main.xml
        layout-large/        # large (portrait)
            main.xml
        layout-large-land/   # large landscape
            main.xml
複製代碼

其餘屏幕適配方式:

(1)頁面控件屬性經常使用適配方法

1.儘可能使用線性佈局(LinearLayout)和相對佈局(RelateLayout),儘可能不使用絕對佈局(AbsoluteLayout)和幀佈局(FrameLayout)。 2.儘可能使用wrap_content、mach_parent讓view自適應或最大化,儘可能不要寫寬高的值。 3.使用線下佈局的百分比weight權重時,要把寬度寫成「0dp「,若是寫成wrap_coent會使佈局效果不佳等問題。 4.儘可能使用android的Shape自定義view背景,這樣會隨之自適應。 5.ImageView的ScaleType有五種方式(center,centerCrop,centerInside,fieCenter,fieXY),儘可能使用fieCenter按比例擴大至view寬度,能取得較好適配和顯示效果。 6.獲取屏幕分辨率信息,進行動態適配:DisplayMetrics metrics =newDisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics);

(2)手機橫豎屏切換兼容適配

咱們會把屏幕設置成單一的橫屏或豎屏,設置的方法是去AndroidMaifest.xml中把activity中的android:screenOrintation設置成landscape或者portrait,這種單一的屏幕模式。若是設置成"sensor",就由物理的感應器來決定。若是用戶旋轉設備這屏幕會橫豎屏切換的時候須要注意布 局問題和從新載入問題。

  • 佈局問題: 在res目錄先創建layout-land和layout-port目錄相應的xml文件名字相同,而後在兩個文件夾下建立相同名字的兩套xml,模擬器就會根據不一樣 的屏幕來進行自動尋找。也能夠只在layout中建立xml,經過this.getResources().getConfiguration().orientation來判斷當前是橫屏仍是豎 屏,而後在oncreate方法中加載不一樣的佈局
  • 從新載入問題:若是不須要從新載入(從新走一遍activity的生命週期),則在AndroidManifest.xml中activity標籤下設置android: configChanges="orientation|keybordHidden",這樣的話就不會重複調用activity的生命週期方法,切換時只會調用 onConfigChanged(Configuration newconfig)。若是須要從新載入,則不須要添加屬性

3、適配不一樣系統版本

新的Android版本會爲咱們的app提供更棒的API,但咱們的app仍應支持舊版本的Android,直到更多的設備升級到新版本爲止。

首先,在項目清單文件中指定最小和目標API級別。具體來講,元素中的minSdkVersion和targetSdkVersion 屬性,標明在設計和測試app時,最低兼容API的級別和最高適用的API級別(這個最高的級別是須要經過咱們的測試的)。例如:

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

其次,是在代碼中判斷檢查版本信息。Android在Build常量類中提供了對每個版本的惟一代號,在咱們的app中使用這些代號能夠創建條件,保證依賴於高級別的API的代碼,只會在這些API在當前系統中可用時,纔會執行。

private void setUpActionBar() {
    // Make sure we're running on Honeycomb or higher to use ActionBar APIs if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { ActionBar actionBar = getActionBar(); actionBar.setDisplayHomeAsUpEnabled(true); } } 複製代碼

最後,使用項目的風格和主題跟隨系統版本改變外觀。Android提供了用戶體驗主題,爲app提供基礎操做系統的外觀和體驗。這些主題能夠在manifest文件中被應用於app中。經過使用內置的風格和主題,咱們的app天然地隨着Android新版本的發佈,自動適配最新的外觀和體驗.

使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">
複製代碼

使整個app應用一個主題(所有activities)在元素中添加android:theme屬性:

<application android:theme="@style/CustomTheme">
複製代碼

若是喜歡本文的話,歡迎點擊一下 「喜歡」 給予鼓勵支持!

相關文章
相關標籤/搜索