【Android】8.4 讓主題自適應不同的Android版本,8.4android
分類:C#、Android、VS2015;
建立日期:2016-02-17 一、簡介
預設情況下,高版本提供的主題不能在低版本的Android系統上運行。但是,通過自訂佈景主題,可以讓你的系統自適應各自對應的版本。這種方式帶來的最大好處是:如果僅僅為了讓你的應用程式自適應不同的Android系統,只需要設計一套應用程式即可,而不需要針對不同的Android系統去分別實現不同的應用程式版本。 二、樣本—ch0804ThemeDemo
1、運行
是本項目主介面在Android 6.0(API 23)模擬器下啟動並執行效果:
不改變任何選項,但是將模擬器選擇為API 19的x86模擬器,然後按<F5>調試運行,此時它就會自動使用Resources/values檔案夾下的style.xml檔案。
下面左圖是本項目主介面在Android 4.4.2(API 19)模擬器下啟動並執行效果,右圖是本樣本啟動並執行效果:
2、設計步驟
例如,材質主題是從Android 5.0(v21)開始提供的,該主題無法在比Android 5.0低的Android 4.4(v19)中使用,但是你又不想僅僅為瞭解決主題問題而再去另外建立一個功能完全相同的項目,即希望讓你的應用程式不需要做任何改變就能自適應所啟動並執行Android系統,此時需要在項目中按下面的步驟實現主題的相容性。
(1)在Resources檔案夾下添加與版本對應的子檔案夾和styles.xml
先在Resources檔案夾下建立一個values-v21子檔案夾,然後在該子檔案夾下下建立一個styles.xml檔案:
<?xml version="1.0" encoding="utf-8" ?><resources> <style name="MyTheme" parent="android:Theme.Material.Light.DarkActionBar"> </style>
……</resources>
values-v21表示該檔案夾下的style.xml檔案僅適用於Android 5.0及更高版本。
(2)在Resources/values檔案夾下添加低版本使用的styles.xml
修改上個例子建立的Resources/values/styles.xml檔案,讓其繼承自舊版本的主題,同時讓使用的名稱和上面自訂的名稱相同:
<?xml version="1.0" encoding="utf-8" ?><resources> <style name="MyTheme" parent="android:Theme.DeviceDefault.Light.DarkActionBar"> </style>
……</resources>
通過以上兩個步驟,就可以用引用自訂佈景主題的辦法實現版本的自適應性了。這是因為當將應用程式運行在Android 5.0及更高版本的裝置上時,系統就會自動使用在Resources/values-v21/styles.xml中指定的主題;當應用程式在低於Android 5.0的裝置上運行時(比如API 19),系統就會自動使用在Resources/values/styles.xml中指定的自訂佈景主題。
(3)引用自訂的主題
要在應用程式層級使用名為“MyTheme”的主題,只需要修改AndroidManifest.xml檔案的配置:
<application android:label="MyApp" android:theme="@style/MyTheme">
</application>
要在某個活動頁面使用自訂的主題,只需要在對應的Activity中聲明它:
[Activity(Label = "MyActivity", Theme = "@style/MyTheme")]
注意:如果你自訂的主題使用的是colors.xml檔案中自訂的顏色,一定要將自訂的這個colors.xml檔案放在Resources/values檔案夾下,而不是放在Resources/values-v21檔案夾下,這樣做的目的是:讓所有版本都可以訪問自訂的顏色。如果放在Resources/values-v21檔案夾下,則只有Android 5.0(API 21)及更高版本可訪問自訂的顏色。
3、本樣本對應的源檔案
(1)ch0804_ThemeDemo.axml檔案
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:text="Hello,這是引用myThemes自訂佈景主題的頁面。" android:textAppearance="?android:attr/textAppearanceLarge" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/textView1" android:gravity="center" /></LinearLayout>
(2)ch0804ThemeDemo.cs檔案
using Android.App;using Android.OS;namespace MyDemos.SrcDemos{ [Activity(Label = "@string/ApplicationName")] public class ch0804ThemeDemo4 : Activity { protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.ch0804_ThemeDemo4); } }}
由於該檔案中沒有指定主題,因此它會自動應用資訊清單檔中指定的對所有頁面都起作用的自訂佈景主題。