动态的改变程序的主题

简介: 在这个教程中,我将对android中的主题做一个简短的介绍,用户可以通过点击一个按钮,动态的在程序运行时改变主题。 主题介绍 在android中,“主题”是一种统一定义你的用户界面的简单的方式。

在这个教程中,我将对android中的主题做一个简短的介绍,用户可以通过点击一个按钮,动态的在程序运行时改变主题。

主题介绍

在android中,“主题”是一种统一定义你的用户界面的简单的方式。从长远来看,定义一个主题不仅可以节省你编写代码的时间,也意味着如果你进行UI调整,紧紧需要在一个地方进行改动。这样做节省了你的时间,降低了人为造成的错误。

主题和风格常常在很多android教程互换使用。为了清晰起见,我们将在本教程中关注主题。它们的区别:

1、  主题是一组格式规则,应用在活动或者程序中。

2、  风格(style)是应用的一个视图中的一组规则。

创建一个自定义主题

在android平台中包括一个预定义的主题,也很容易创建自己的主题,两者之间可以很方便的进行转换。

当你创建一个项目是,Eclipse会在res/values下自动生成styles.xml的文件。你可以在styles.xml文件中定义主题。或者你想将风格和主题分开,可以选择为主题建立一个独立的文件。创建themes.xml文件,你可以右击工程,点击new,选择Android XML File。

不管使用那个文件,以下是具体步骤:

1)  添加<resources>标签:

<resources>
</resources>


2)  给你的主题添加一个唯一的名字,添加结束标签,如下:

<resources>
<stylename="BlackTheme" >
</style>
</resources>


3)  定义你的主题的相关属性和值:

<itemname="android:background">#000000</item>

在本教程中,我们将创建两个主题,定义不同的背景颜色和文本颜色:

<resources>
<stylename="BlackTheme" >
<itemname="android:background">#000000</item>
<itemname="android:textColor">#FFFFFF</item>
</style>
<stylename="BlueTheme" >
<itemname="android:background">#B0E0E6</item>
<itemname="android:textColor">#000000</item>
</style>
</resources>


创建布局

要检查主题之间是否正常切换,我们将创建一个布局,用来显示文本和背景颜色的变化。我们也会给用户一种切换主题的方式。

打开你的布局文件,输入如下代码:

<?xmlversion="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="14dp"
android:text="@string/pick"
android:textAppearance="?android:attr/textAppearanceLarge"/>
<Button
android:id="@+id/blackbutton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/textView1"
android:text="@string/black"/>
<Button
android:id="@+id/bluebutton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignRight="@+id/blackbutton"
android:layout_below="@+id/blackbutton"
android:text="@string/blue"/>
<EditText
android:id="@+id/editText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView2"
android:layout_below="@+id/bluebutton"
android:ems="10"
android:hint="Name"
android:inputType="textPersonName">
</EditText>
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignRight="@+id/editText3"
android:layout_below="@+id/editText3"
android:text="@string/agree"/>
<EditText
android:id="@+id/editText3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/editText1"
android:ems="10"
android:hint="Password"
android:inputType="numberPassword"/>
</RelativeLayout>


保存之后可能会提示有错误,不用管,跟进以下步骤。

定义你的Strings

以下定义布局文件定义的几个字符串。打开res/values/strings.xml,修改如下:

<resources>
    <string name="app_name">主题</string>
    <string name="black">黑色</string>
    <string name="blue">蓝色</string>
    <string name="pick">选择颜色</string>
    <string name="agree">同意你的条件。</string>
</resources>


MainActivity.java

现在是重点,打开MainAcitivity(src/com/songsoft/themes),没有的话新建,现在我们来讲解一下。

import android.os.Bundle;
importandroid.app.Activity;
importandroid.view.View;
importandroid.view.View.OnClickListener;


这些是程序需要使用的各种类和接口。其中OnClickListener是响应按钮单击事件。

publicclass MainActivity extends Activity implements OnClickListener
{
/**活动第一次创建是调用*/
@Override
publicvoid onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
themeUtils.onActivityCreateSetTheme(this);
setContentView(R.layout.main);
//这里调用了OnClickListener,现在,忽略Eclipse抛出的错误。
findViewById(R.id.blackbutton).setOnClickListener(this);
findViewById(R.id.bluebutton).setOnClickListener(this);
}
@Override
//点击事件
publicvoid onClick(View v)
{
switch(v.getId())
{
//当按钮单击时调用。
caseR.id.blackbutton:
themeUtils.changeToTheme(this,themeUtils.BLACK);
break;
caseR.id.bluebutton:
themeUtils.changeToTheme(this,themeUtils.BLUE);
break;
}
}
}


将主题同时设置黑色和蓝色是不可能的,因此添加break语句。

注意,这一节将抛出大量的错误,我们将在下一节创建themeUtils类来消除这些警告和错误。

创建themeUtils.java

下面是创建我们在MainActivity.java中提到的新类,并创建一些静态方法来支持主题的变化。

打开src/com.songsoft.themes,右键单击,创建一个类,输入名字themeUtils

如图:

打开这个文件,输入以下代码:

packagecom.songsoft.themes;
importandroid.app.Activity;
importandroid.content.Intent;
 public class themeUtils
{
privatestatic int cTheme;
publicfinal static int BLACK = 0;
publicfinal static int BLUE = 1;
publicstatic void changeToTheme(Activity activity, int theme)
{
cTheme =theme;
activity.finish();
activity.startActivity(newIntent(activity, activity.getClass()));
 }
publicstatic void onActivityCreateSetTheme(Activity activity)
{
switch(cTheme)
{
default:
caseBLACK:
activity.setTheme(R.style.BlackTheme);
break;
caseBLUE:
activity.setTheme(R.style.BlueTheme);
break;
}
}
}


检查一下

themeUtils创建完成后,点击保存,所有的提示错误消失。

启动模拟器,这里的版本是Android2.3.3。看看效果。

 

感兴趣的同学可以改一下相关代码,添加相关按钮,增加主题。

目录
相关文章
|
9月前
|
机器学习/深度学习 编解码 Java
YOLOv11改进策略【卷积层】| GnConv:一种通过门控卷积和递归设计来实现高效、可扩展、平移等变的高阶空间交互操作
YOLOv11改进策略【卷积层】| GnConv:一种通过门控卷积和递归设计来实现高效、可扩展、平移等变的高阶空间交互操作
265 0
YOLOv11改进策略【卷积层】| GnConv:一种通过门控卷积和递归设计来实现高效、可扩展、平移等变的高阶空间交互操作
|
Rust Linux iOS开发
|
前端开发 API C#
使用Unity 接入 Stable-Diffusion-WebUI的 文生图api 并生成图像
本文介绍了如何将Unity游戏引擎与Stable-Diffusion-WebUI的文生图API相结合,实现在Unity中生成图像的功能。内容包括启动Stable Diffusion的API设置、在Unity中创建脚本与UI配置,以及通过按钮点击事件触发图像生成的详细步骤和测试过程。
使用Unity 接入 Stable-Diffusion-WebUI的 文生图api 并生成图像
|
存储 Windows
Windows 记录一次磁盘相关的PC卡顿问题
【10月更文挑战第25天】本文记录了一次 Windows 10 电脑卡顿问题的排查与解决过程。通过资源监视器、事件查看器、SMART 信息检查、磁盘扫描、后台程序排查、驱动更新等步骤,最终通过磁盘碎片整理和调整虚拟内存设置解决了卡顿问题。文章还提供了定期磁盘维护、合理设置虚拟内存及关注硬件健康的预防措施。
568 1
|
SQL DataWorks 数据挖掘
手把手体验Hologres的OLAP数据分析
本方案基于阿里云实时数仓Hologres与DataWorks数据集成,实现数据库RDS到Hologres的实时同步,充分发挥Hologres强大的查询分析能力,提供一站式高性能OLAP数据分析。Hologres支持标准SQL,无缝对接主流BI工具,适用于多种场景。方案包括创建VPC、开通Hologres、开通DataWorks、创建公网NAT、建立Hologres表、实时同步数据、OLAP分析及资源清理等步骤,为轻量级OLAP分析平台搭建奠定基础。
|
缓存 监控 前端开发
react 性能优化方案?
【7月更文挑战第15天】改善React应用性能的关键策略包括:使用生产环境构建减少体积,避免不必要的渲染(如用React.memo或PureComponent),正确设置列表渲染的key,简化组件层级,实施懒加载,避免render中的复杂计算,选择优化过的库,控制重渲染范围,监控性能并合并state更新。这些优化能提升响应速度和用户体验。
275 0
|
安全 算法 Java
Java报错:java.security.InvalidKeyException: Illegal key size
Java报错:java.security.InvalidKeyException: Illegal key size
1231 0
|
Java
【Java】已解决java.nio.channels.ClosedChannelException异常
【Java】已解决java.nio.channels.ClosedChannelException异常
1375 1
|
NoSQL 算法 安全
Redis 分布式锁的正确实现原理演化历程与 Redisson 实战总结
Redis 分布式锁的正确实现原理演化历程与 Redisson 实战总结
970 1
|
数据挖掘 atlas 数据库
TCGA数据挖掘 | Xena - TCGA数据下载
TCGA数据挖掘 | Xena - TCGA数据下载
759 1