分类: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),
Title = "例8-1 主题基本用法",
Desc = "演示如何设置应用程序级别的主题和仅本页使用的主题" },
new ChItem { type = typeof(ch0802ThemeDemo2),
Title = "例8-2 动态选择和设置主题",
Desc = "演示如何动态选择和设置仅当前界面使用的主题" },
new ChItem { type = typeof(ch0803ThemeDemo3),
Title = "例8-3 自定义主题",
Desc = "演示如何自定义主题及其样式让其更符合你的想法" },
new ChItem { type = typeof(ch0804ThemeDemo4),
Title = "例8-4 让主题自适应不同的Android版本",
Desc = "演示如何让不同的Android系统自动使用相应的主题" },
}
});
二、主题基本用法
1、查看主题
在.axml文件的【设计界面】中,可直接观察某种主题应用的效果。办法如下:在对应的设计界面中,单击【Theme】à【More Themes】,此时就会弹出下图所示的所有主题:
选择某种主题,单机【OK】按钮,它就会将所选主题应用到当前的设计界面中。
注意:这种方式仅仅是为了观察采用哪种主题比较合适。确定了合适的主题后,还需要在清单文件或者活动文件中指定所选的主题,此时它才会真正起作用。
2、指定主题
有两种指定主题(包括内置的主题和自定义主题)的方式。
(1)在清单文件中指定所有页面默认使用的主题
以下两种形式可任选其一,但不要两种形式都去指定。
第一种方式是在properties文件夹下的AndroidManifest.xml文件中配置“应用程序级别”的主题,应用程序级别的主题对所有页面都有效。例如:
<application android:label="MyApp"
android:theme="@android:style/Theme.DeviceDefault.Light">
</application>
第二种方式是在properties文件夹下的AssemblyInfo.cs文件中配置应用程序级别的主题,应用程序级别的主题对所有页面都有效。例如:
[assembly:Application(Theme = "@android:style/Theme.DeviceDefault.Light")]
(2)在Activity中指定本页使用的主题
除了指定应用程序级别的主题外,还可以在某个活动中(.cs文件中)指定仅适用于当前活动页面的主题,用这种方式指定的主题仅对该活动有效,其他Activity仍会使用默认的主题。例如:
[Activity(Theme = "@android:style/Theme. DeviceDefault.Light.DarkActionBar",
Label = "MyApp", MainLauncher = true, Icon = "@drawable/icon")]
三、材料主题(Material Theme)
材料(Material)也叫材质,学过3D开发的对Material这个概念肯定不陌生,不管中文怎么翻译它,记住就是这个英文单词就OK了。
Material Theme是从Android 5.0(API 21)开始提供的内置主题,常用有:
- Theme.Material – 黑色材质背景,这是Android 5.0默认的主题。
- Theme.Material.Light –浅色材质背景。
- Theme.Material.Light.DarkActionBar – 浅色材质背景,但活动条(ActionBar)是黑色的材质背景。
由于可以将材质设置为各种类型的图形或图像,因此这种主题可提供非常大的灵活性。
使用Material Theme的要求
(1)必须安装Android 5.0 (API 21)或更高版本的Android SDK。
(2)需要使用Java JDK 1.7或更高版本的JDK编译Android应用程序。
(3)Xamarin.Android版本不能低于4.2。
由于前面章节介绍的安装开发环境已经满足了这些要求,所以可直接使用材质主题。
注:Xamarin for VS 4.0.1717对应的Xamarin.Android版本为6.0.0.35,可在VS2015中通过【帮助】查看你当前安装的Xamarin.Android版本。
下面的代码演示了如何在应用程序级别使用材质主题(对所有Activity都有效):
<application android:label="MyApp"
android:theme="@android:style/Theme.Material.Light">
</application>
也可以在AssemblyInfo.cs文件中配置它。例如:
[assembly: Application(Theme="@android:style/Theme.Material.Light")]
下面的代码演示了如何在Activity中使用材质主题(仅对该Activity有效):
[Activity(Label = "MyApp", MainLauncher = true, Icon = "@drawable/icon",
Theme = "@android:style/Theme.Material.Light")]
public class MainActivity : Activity
{
……
}
四、示例-ch0801ThemeDemo
该示例仅为了观察分别指定应用程序级别的主题和仅适用于某个活动主题的效果。
1、运行截图
2、代码分析
从运行截图中可以看出,由于左图没有在ch0801ThemeDemo1.cs文件中指定Theme,因此它使用的主题是清单文件(AndroidManifest.xml)中定义的主题,以这种方式指定的Theme适用于所有页面。
清单文件(AndroidManifest.xml)中的相关代码如下:
<application android:label="MyDemos"
android:theme="@android:style/Theme.DeviceDefault.Light.DarkActionBar">
……
</application>
ch0801ThemeDemo1.cs文件的代码如下:
using Android.App;
using Android.OS;
using Android.Widget;
namespace MyDemos.SrcDemos
{
[Activity(Label = "【例8-1】主题基本用法")]
public class ch0801ThemeDemo1 : Activity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.ch0801_ThemeDemo1);
FindViewById<Button>(Resource.Id.btn1).Click += delegate
{
StartActivity(typeof(ch0801ThemeDemo2));
};
}
}
}
对于运行截图中的右图来说,由于在ch0801ThemeDemo2.cs文件中指定了Theme,因此这个页面使用的主题就是这个Theme,而不是清单文件中指定的主题,但该Theme仅适用于这个页面。
ch0801ThemeDemo2.cs文件的代码如下:
using Android.App;
using Android.OS;
using Android.Widget;
namespace MyDemos.SrcDemos
{
[Activity(Label = "【例8-1】主题基本用法",
Theme = "@android:style/Theme.DeviceDefault")]
public class ch0801ThemeDemo2 : Activity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.ch0801_ThemeDemo2);
FindViewById<Button>(Resource.Id.btn1).Click += delegate {
StartActivity(typeof(ch0801ThemeDemo1));
};
}
}
}