若转载请注明出处!
本文的主题思想是:
1》设置activity的theme,这个好设置,可参考 http://blog.csdn.net/wsscy2004/article/details/7562909
2》设置xml里面组件的style,我的实现是通过:获取组件,然后遍历他们去设置style(其中style的内容查找比较麻烦,我是通过反射R.class和解析style.xml做到的,有些地方需要人为手动设置)
public static void onActivityCreateSetStyle(ViewGroup viewGroup) {
Log.d(tag, "onActivityCreateSetStyle");
if (mButtonStyle != 0) {
List<Button> list = getWidgetButton(viewGroup);
Log.d(tag, "onActivityCreateSetStyle button num == " + list.size());
if (list != null && !list.isEmpty()) {
String styleName = mApp.styles.get(mButtonStyle);// 得到样式name
Log.d(tag, "onActivityCreateSetStyle styleName == " + styleName);
StyleBean style = null;
for (StyleBean item : mApp.styledata) {
if (styleName.equals(item.getName())) {
style = item;// 得到样式的具体内容
}
}
List<String> methodNames = style.getMethodNames();
List<Class> paramTypes = style.getTypeClasses();
List<Object> values = style.getValues();
for (Button button : list) {
Log.d(tag, "method num == " + methodNames.size());
for (int i = 0; i < methodNames.size(); i++) {
Log.d(tag, "Button setMethod : " + methodNames.get(i));
Method method = getClassMethod(Button.class,
methodNames.get(i),
new Class[] { paramTypes.get(i) });
try {
if ("setTextColor".equals(methodNames.get(i))) {
method.invoke(
button,
context.getResources().getColor(
Integer.parseInt(values.get(i)
.toString())));
} else if ("setTextSize".equals(methodNames.get(i))) {
method.invoke(button, Float.parseFloat(values
.get(i).toString()));
}
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
}
这是上面用到的StyleBean
import java.util.List;
/**
* Style element bean
*
* @author Administrator
*
*/
@SuppressWarnings("rawtypes")
public class StyleBean {
private String name;
/**
* the method name associated with the attribute
*/
private List<String> methodNames;
/**
* the class associated with the attribute
*/
private List<Class> typeClasses;
/**
* the value associated with the attribute
*/
private List<Object> values;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<String> getMethodNames() {
return methodNames;
}
public void setMethodNames(List<String> methodNames) {
this.methodNames = methodNames;
}
public List<Class> getTypeClasses() {
return typeClasses;
}
public void setTypeClasses(List<Class> typeClasses) {
this.typeClasses = typeClasses;
}
public List<Object> getValues() {
return values;
}
public void setValues(List<Object> values) {
this.values = values;
}
}
###反射R.class、解析style.xml,把R和style中的信息整理到类中,解析xml用的是sax,在解析style.xml的时候,注意把对应的方法、方法的参数类型记录下来,因为后面要通过反射来操作,eg:
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
super.startElement(uri, localName, qName, attributes);
buffer.delete(0, buffer.length());
itemName.delete(0, itemName.length());
if (localName.equals("style")) {
style = new StyleBean();
style.setName(attributes.getValue("name"));
Log.d(tag, "style name == " + style.getName());
methodNames = new ArrayList<String>();
typeClasses = new ArrayList<Class>();
values = new ArrayList<Object>();
} else if (localName.equals("item")) {
itemName.append(attributes.getValue("name"));
Log.d(tag, "item name == " + attributes.getValue("name") + " "
+ itemName.toString());
Log.d(tag, "" + itemName.toString().equals("android:textColor"));
if (itemName.toString().equals("android:textColor")) {
methodNames.add("setTextColor");// 手动设置
typeClasses.add(int.class);
} else if (itemName.toString().equals("android:textSize")) {
methodNames.add("setTextSize");// 手动设置
typeClasses.add(float.class);
}
}
}
//.....只贴关键的部分其他的方法就省略了
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// TODO Auto-generated method stub
super.endElement(uri, localName, qName);
if (localName.equals("item")) {
String value = buffer.toString();
if (itemName.toString().equals("android:textColor")) {
if (value.contains("@color/")) {
RChildBean bean = getRChildBean("color");
if (bean != null) {
int color = getRValue(bean, value.substring(
value.lastIndexOf("/") + 1, value.length()));
Log.d(tag, "color == " + color);
if (color != -1) {
values.add(color);
}
}
bean = null;
}
} else if (itemName.toString().equals("android:textSize")) {
Log.d(tag, "size == " + value.substring(0, value.indexOf("sp")));
values.add(value.substring(0, value.indexOf("sp")));
}
} else if (localName.equals("style")) {
style.setMethodNames(methodNames);
style.setTypeClasses(typeClasses);
style.setValues(values);
styles.add(style);
}
}
private RChildBean getRChildBean(String name) {
for (RChildBean item : app.rchildlist) {
if (name.equals(item.getName())) {
return item;
}
}
return null;
}
private int getRValue(RChildBean child, String name) {
if (child.getItems().containsKey(name)) {
return child.getItems().get(name);
}
return -1;
}
这是上面用到的RChildBean
import java.util.Map;
/**
* R child class bean
*
* @author Administrator
*/
public class RChildBean {
/**
* R child name
*/
private String name;
/**
* R child items
*/
private Map<String, Integer> items;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Map<String, Integer> getItems() {
return items;
}
public void setItems(Map<String, Integer> items) {
this.items = items;
}
}
分享到:
相关推荐
这篇博客“Android Style\\Theme动态切换”可能探讨了如何在Android应用程序中实现实时改变主题和样式的技巧。 首先,我们需要理解Android中的Theme和Style的基本概念。Theme是全局的,通常应用于整个应用程序或...
发现坑 最近在配置项目主题的时候报了如下错误: This Activity already has an...style name=AppTheme.NoActionBar> <item name=android:windowActionBar>false <item name=android:windowNoTitle>true <ite
"Android夜间模式动态切换"这个话题主要关注如何在应用程序中实现实时改变界面颜色方案,以便用户可以在明亮环境下舒适地使用(日间模式)或者在暗环境中减少眼睛疲劳(夜间模式)。Android官方从Support Library ...
- 对于使用第三方库的应用,需确保库也支持动态Theme切换,或者对库进行适配。 - 切换Theme时可能会导致短暂的视觉闪烁,可以通过使用过渡动画或延迟Activity重启来缓解这个问题。 总结,实现Android应用的夜间...
在Android开发中,动态切换主题是一项重要的功能,它允许用户根据个人喜好自由调整应用程序的视觉样式。本篇文章将深入探讨如何在Android应用中实现动态切换主题,并提供一份完美代码示例。 首先,我们需要理解...
3. **动态切换主题**:实现动态主题切换通常需要编写代码来改变Activity的Theme。这可以通过在运行时获取当前主题,然后设置新的主题来完成。使用`setTheme()`函数可以在Activity的`onCreate()`方法之前调用来更改...
首先,理解Android的Theme和Style。Theme是应用于整个应用程序或特定组件的全局样式,而Style则是对单个组件属性的定制。在AndroidManifest.xml中,我们可以通过设置`<application>`或`<activity>`标签的`android:...
android:theme="@style/AppTheme"> <!-- ... --> ``` 5. **监听系统主题变化**: 使用`registerOnConfigurationChangedListener()`可以监听到系统主题的变化,然后相应地更新应用的主题。 ```java ...
本篇文章将深入探讨如何在Android应用中动态地改变Style,以及Theme与Style的区别。 首先,让我们了解什么是Theme和Style。在Android中,Theme是一种全局样式,它应用于整个应用程序或特定的Activity。通过设置`...
在实际开发中,你还可以结合主题(Theme)和样式(Style)来统一应用到整个应用程序,使得设计更加一致且易于维护。通过不断地实践和调整,你可以创造出满足项目需求的各种独特按钮样式。在`11StyleSample`这个...
首先,Android的日夜模式切换主要依赖于Android系统的`AppCompat`库和`Theme.AppCompat.DayNight`主题系列。这些主题允许应用在日间和夜间之间动态切换,提供不同的视觉体验。要启用这个功能,我们需要在`res/values...
在Android开发中,"androidStyle"是一个重要的概念,它关乎到应用的视觉呈现和用户体验。风格(Style)允许开发者统一并定制应用中的UI元素外观,包括字体、颜色、尺寸等属性,使得整体界面具有一致性和专业性。下面...
在Android应用开发中,主题(Theme)是一种强大的工具,它允许开发者通过全局的方式改变应用程序的外观和风格。主题切换不仅可以改变字体颜色、背景色,还可以调整图片引用以及其他UI元素的样式,为用户提供个性化的...
android:theme="@style/CustomTheme"> ... <!-- 或者在特定Activity --> android:name=".MainActivity" android:theme="@style/CustomTheme"> ``` 4. **主题切换** - 要实现一键切换主题,首先需要...
例如,可能会有一个<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">,这表示"AppTheme"主题继承自"Theme.AppCompat.Light.DarkActionBar",这是一个常见的Android支持库提供的主题,包含轻量...
在Android开发中,UI界面的设计和交互是用户体验的关键部分,而动态切换主题是提升用户个性化体验的一个重要功能。本文将详细解析如何实现Android应用中切换主题的代码。 首先,我们需要理解Android中的主题(Theme...
在Android应用开发中,主题(Theme)的切换是提升用户体验的重要手段之一,它允许用户根据个人喜好或场景需求改变应用程序的整体视觉风格。本资源提供的"Android界面主题切换源码分享"是一个实现Android应用主题切换...
总结,Android主题和皮肤主题的应用涉及资源文件的管理、XML样式定义、代码中主题的设置和切换、第三方库的利用,以及动态主题切换和皮肤包的打包分发。理解并掌握这些知识点,将有助于开发出更加美观、个性化的...
接着定义`fade`样式,它继承自`@android:style/Animation.Activity`,并设置四个与Activity切换相关的动画属性,分别是打开进入、打开退出、关闭进入和关闭退出的动画资源: ```xml <style name="fade" parent="@...
android:theme="@style/AppTheme.WindowTransition" /> ``` 这样,当`KingAnimationActivity`启动或退出时,就会应用我们定义的淡入淡出动画了。 然而,值得注意的是,从Android 3.0(API级别11)开始,`android:...