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

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

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

  1. 【Android】8.1 主题基本用法

    分类:C#.Android.VS2015: 创建日期:2016-02-17 一.创建本章示例主界面 1.界面截图 2.MainActivity.cs文件中对应的代码 在CreateChItems()方 ...

  2. Android指南 - 样式和主题

    本文翻译自:https://developer.android.com/guide/topics/ui/themes.html Style和theme词汇是专用术语,下文直接使用而不翻译. 样式和主题 ...

  3. Android开发指南-框架主题-安全和许可

    概述:Android操作系统是一个安全便捷的Linux系统,遵循Linux系统机制,允许多进程.为了进程间的数据共享和交互共用,设计"权限"这个名词,声明权限代表可使用此权限,未声 ...

  4. Android 开发系列教程之(一)Android基础知识

    什么是Android Android一词最早是出现在法国作家维里耶德利尔·亚当1986年发表的<未来夏娃>这部科幻小说中,作者利尔·亚当将外表像人类的机器起名为Android,这就是And ...

  5. Android(java)学习笔记120:Android中的Application类用法

    1.简介 如果想在整个应用中使用全局变量,在java中一般是使用静态变量,public类型:而在android中如果使用这样的全局变量就不符合Android的框架架构,但是可以使用一种更优雅的方式就是 ...

  6. Android(java)学习笔记162:Android启动过程(转载)

    转载路径为: http://blog.jobbole.com/67931/ 1. 关于Android启动过程的问题: 当按下Android设备电源键时究竟发生了什么? Android的启动过程是怎么样 ...

  7. 《ArcGIS Runtime SDK for Android开发笔记》——(1)、Android Studio下载与安装

    1.前言 Android Studio 是一个Android开发环境,基于IntelliJ IDEA. 类似 Eclipse ADT,Android Studio 提供了集成的 Android 开发工 ...

  8. Android(java)学习笔记61:Android中的 Application类用法

    1. 简介 如果想在整个应用中使用全局变量,在java中一般是使用静态变量,public类型:而在android中如果使用这样的全局变量就不符合Android的框架架构,但是可以使用一种更优雅的方式就 ...

  9. Android(java)学习笔记105:Android启动过程(转载)

    转载路径为: http://blog.jobbole.com/67931/ 1. 关于Android启动过程的问题: 当按下Android设备电源键时究竟发生了什么? Android的启动过程是怎么样 ...

随机推荐

  1. wine的使用

    ubuntu-ubuntu10.04使用wine安装SourceInsight http://www.cnblogs.com/eddy-he/archive/2012/03/08/ubuntu_win ...

  2. Linux下串口操作之数据拼接

    串口操作中,特别以非阻塞的方式读取和发送数据,做好进程之间的同步很重要.有时我们会发现这样一个问题,在进行read操作时,一次read不能获得一个完整的数据帧,这就好比你买了一个电脑,送货的先把显示器 ...

  3. Struts2(一)

    一.Struts下载地址 http://struts.apache.org/download.cgi 二.导入包.配置Web.xml和struts.xml 在下载的包中从示例中找到一些包就可以 str ...

  4. BIOS和Bootloader的对比

    桌面电脑刚加电时,一个叫做BIOS的软件程序立刻获得了处理器的控制权.(历史上,BIOS是Basic Input/Output Software的缩写,但现在这个单词已经有了自身的含义,因为其完成的功 ...

  5. MySQL单列索引和组合索引(联合索引)的区别详解

    发现index merge局限性,优化器会自动判断是否使用 index merge 优化技术,查询还是需要组合索引[推荐阅读:对mysql使用索引的误解] MySQL单列索引和组合索引(联合索引)的区 ...

  6. python中的静态成员方法和类成员方法

    Python的静态方法和类成员方法都可以被类或实例访问,两者概念不容易理清,但还是有区别的: 1)静态方法无需传入self参数,类成员方法需传入代表本类的cls参数: 2)从第1条,静态方法是无法访问 ...

  7. 设定StatusBar的文字成不同的颜色

    设定StatusBar上的文字,该文字以StatusBar所在Form的字型设定为准,并以form的ForeColor为字的颜色,文字过长时,自动会截除这个程式的实质意义不太大,因为当文字被盖掉後需自 ...

  8. 服务名无效。请键入 NET HELPMSG 2185 以获得更多的帮助。

    1:关闭MySQL服务的时候出现“服务名无效.请键入 NET HELPMSG 2185 以获得更多的帮助.”错误. 2:查看服务名称 3:重新关闭服务 4:管理员运行控制台后重新执行 成功停掉了.

  9. C/C++程序内存分类

    程序中内存分类主要有下面几种: (1)栈存储区:主要存储局部变量.函数參数.函数返回值等. 栈内存由编译器在须要时自己主动分配,使用完后自己主动释放. (2)堆存储区:由new.malloc申请到的空 ...

  10. 使用Elasticsearch 与 NEST 库 构建 .NET 企业级搜索

    使用Elasticsearch 与 NEST 库 构建 .NET 企业级搜索 2015-03-26 dotNET跨平台 最近几年出现的云计算为组织和用户带来了福音.组织对客户的了解达到前所未有的透彻, ...