分类: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); } } }
由于该文件中没有指定主题,因此它会自动应用清单文件中指定的对所有页面都起作用的自定义主题。