【Android】8.4 让主题自适应不同的Android版本

分类: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);
        }
    }
}

由于该文件中没有指定主题,因此它会自动应用清单文件中指定的对所有页面都起作用的自定义主题。

时间: 2024-08-08 09:41:20

【Android】8.4 让主题自适应不同的Android版本的相关文章

【Android】8.1 主题基本用法

分类:C#.Android.VS2015: 创建日期:2016-02-17 一.创建本章示例主界面 1.界面截图 2.MainActivity.cs文件中对应的代码 在CreateChItems()方法中添加下面的代码: chItems.Add(new Chapter() { ChapterName = "第8章 样式和主题", ChapterItems = new ChItem[] { new ChItem { type = typeof(ch0801ThemeDemo1), Tit

android下apkplug通用主题(皮肤)切换解决方案之主题包开发-02

该文章是基于apkplug V1.6.8 进行说明的 我们提供了一个demo做为参考,项目下载地址为:http://git.oschina.net/plug/IMThemeDemo 该 IMThemeDemo 实现了简单的聊天泡泡切换功能,同时主题包(插件)是托管在apkplug的云服务器上的.所以要阅读项目的完整代码可以先看插件托管服务开发系列文章 <插件托管服务开发指南> demo运行效果图: 上一篇文章我们实现了主应用的开发,本篇应用我们开发主题包(插件). 一,主题包说明 apkplu

Android开发之修改主题去掉titlebar

修改主题,去掉titlebar目前开发android,系统默认主题为@style/AppTheme,但是含有titlebar,去掉titlebar的方法的方法是给默认主题添加属性 主题:Theme.Black.NoTitleBar没有titlebar是因为加了<item name="windowNoTitle">true</item>所以可以把系统默认主题@style/AppTheme,添加属性<item name="windowNoTitle&

Android不同手机屏幕分辨率自适应【转】

有必要了解的 Android中常见的单位 dip, dp, px, sp之间的区别: dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA.HVGA和QVGA 推荐使用这个,不依赖像素.px: pixels(像素). 不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多.pt: point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用:sp: scal

Android app与Activity主题配置

一.样式和主题(style and theme) 1.1 样式(style)是来指定视图和窗口的外观和格式的一组属性集合.样式可以指定文本.字体及大小.背景颜色等属性.比如: 1 <resources> 2 3 <style name="customfont"> 4 <item name="android:layout_width">match_parent</item> 5 <item name="a

android下apkplug通用主题(皮肤)切换解决方案之主应用-01

该文章是基于apkplug V1.6.8 进行说明的 我们提供了一个demo做为参考,项目下载地址为:http://git.oschina.net/plug/IMThemeDemo 该 IMThemeDemo 实现了简单的聊天泡泡切换功能,同时主题包(插件)是托管在apkplug的云服务器上的.所以要阅读项目的完整代码可以先看插件托管服务开发系列文章 <插件托管服务开发指南> demo运行效果图: 一,apkplug的主题说明 apkplug主题解决方案摒弃了以往以图片替换的形式切换效果的方式

【Android的从零单排开发日记】——Android数据存储(上)

在讲解Android的数据源组件——ContentProvider之前我觉得很有必要先弄清楚Android的数据结构. 数据和程序是应用构成的两个核心要素,数据存储永远是应用开发中最重要的主题之一,也是开发平台必须提供的基础功能.不光是在Android平台上,在其他的平台上,数据的存储永远是不可缺少的一块.Android的数据存储是构建在Linux的文件系统上,它充分利用Linux的账号系统来限定应用对数据的访问,部署了一套安全和灵活并重的数据存储解决方案.Android的文件框架,以及各种数据

【读书笔记-《Android游戏编程之从零开始》】6.Android 游戏开发常用的系统控件(TabHost、ListView)

3.9 TabSpec与TabHost TabHost类官方文档地址:http://developer.android.com/reference/android/widget/TabHost.html Android 实现tab视图有2种方法,一种是在布局页面中定义<tabhost>标签,另一种就是继承tabactivity.但是我比较喜欢第二种方式,应为如果页面比较复杂的话你的XML文件会写得比较庞大,用第二种方式XML页面相对要简洁得多. <?xml version="1

Android官方入门文档[11]支持不同平台版本

Android官方入门文档[11]支持不同平台版本 Supporting Different Platform Versions支持不同平台版本 This lesson teaches you to1.Specify Minimum and Target API Levels2.Check System Version at Runtime3.Use Platform Styles and Themes You should also read?Android API Levels?Androi