`
trinityblood
  • 浏览: 116746 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android Style\Theme动态切换

阅读更多
若转载请注明出处!

本文的主题思想是:
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 Style\\Theme动态切换”可能探讨了如何在Android应用程序中实现实时改变主题和样式的技巧。 首先,我们需要理解Android中的Theme和Style的基本概念。Theme是全局的,通常应用于整个应用程序或...

    Android设置theme中可能遇到的坑

    发现坑 最近在配置项目主题的时候报了如下错误: This Activity already has an...style name=AppTheme.NoActionBar&gt; &lt;item name=android:windowActionBar&gt;false &lt;item name=android:windowNoTitle&gt;true &lt;ite

    Android夜间模式动态切换

    "Android夜间模式动态切换"这个话题主要关注如何在应用程序中实现实时改变界面颜色方案,以便用户可以在明亮环境下舒适地使用(日间模式)或者在暗环境中减少眼睛疲劳(夜间模式)。Android官方从Support Library ...

    Android改Theme实现夜间模式

    - 对于使用第三方库的应用,需确保库也支持动态Theme切换,或者对库进行适配。 - 切换Theme时可能会导致短暂的视觉闪烁,可以通过使用过渡动画或延迟Activity重启来缓解这个问题。 总结,实现Android应用的夜间...

    android 动态切换主题

    在Android开发中,动态切换主题是一项重要的功能,它允许用户根据个人喜好自由调整应用程序的视觉样式。本篇文章将深入探讨如何在Android应用中实现动态切换主题,并提供一份完美代码示例。 首先,我们需要理解...

    Android 主题动态切换

    3. **动态切换主题**:实现动态主题切换通常需要编写代码来改变Activity的Theme。这可以通过在运行时获取当前主题,然后设置新的主题来完成。使用`setTheme()`函数可以在Activity的`onCreate()`方法之前调用来更改...

    利用Theme自定义Activity间的切换动画

    首先,理解Android的Theme和Style。Theme是应用于整个应用程序或特定组件的全局样式,而Style则是对单个组件属性的定制。在AndroidManifest.xml中,我们可以通过设置`&lt;application&gt;`或`&lt;activity&gt;`标签的`android:...

    Android白天夜间模式切换

    android:theme="@style/AppTheme"&gt; &lt;!-- ... --&gt; ``` 5. **监听系统主题变化**: 使用`registerOnConfigurationChangedListener()`可以监听到系统主题的变化,然后相应地更新应用的主题。 ```java ...

    android change style

    本篇文章将深入探讨如何在Android应用中动态地改变Style,以及Theme与Style的区别。 首先,让我们了解什么是Theme和Style。在Android中,Theme是一种全局样式,它应用于整个应用程序或特定的Activity。通过设置`...

    Android Style实例总结

    在实际开发中,你还可以结合主题(Theme)和样式(Style)来统一应用到整个应用程序,使得设计更加一致且易于维护。通过不断地实践和调整,你可以创造出满足项目需求的各种独特按钮样式。在`11StyleSample`这个...

    android 日夜模式切换

    首先,Android的日夜模式切换主要依赖于Android系统的`AppCompat`库和`Theme.AppCompat.DayNight`主题系列。这些主题允许应用在日间和夜间之间动态切换,提供不同的视觉体验。要启用这个功能,我们需要在`res/values...

    androidStyle

    在Android开发中,"androidStyle"是一个重要的概念,它关乎到应用的视觉呈现和用户体验。风格(Style)允许开发者统一并定制应用中的UI元素外观,包括字体、颜色、尺寸等属性,使得整体界面具有一致性和专业性。下面...

    Android 主题切换,切换字体颜色颜色,背景色,图片引用文件等

    在Android应用开发中,主题(Theme)是一种强大的工具,它允许开发者通过全局的方式改变应用程序的外观和风格。主题切换不仅可以改变字体颜色、背景色,还可以调整图片引用以及其他UI元素的样式,为用户提供个性化的...

    android主题设置与主题切换

    android:theme="@style/CustomTheme"&gt; ... &lt;!-- 或者在特定Activity --&gt; android:name=".MainActivity" android:theme="@style/CustomTheme"&gt; ``` 4. **主题切换** - 要实现一键切换主题,首先需要...

    Android应用源码之theme.zip

    例如,可能会有一个&lt;style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"&gt;,这表示"AppTheme"主题继承自"Theme.AppCompat.Light.DarkActionBar",这是一个常见的Android支持库提供的主题,包含轻量...

    Android UI界面之切换主题的实现代码.rar

    在Android开发中,UI界面的设计和交互是用户体验的关键部分,而动态切换主题是提升用户个性化体验的一个重要功能。本文将详细解析如何实现Android应用中切换主题的代码。 首先,我们需要理解Android中的主题(Theme...

    Android界面主题切换源码分享

    在Android应用开发中,主题(Theme)的切换是提升用户体验的重要手段之一,它允许用户根据个人喜好或场景需求改变应用程序的整体视觉风格。本资源提供的"Android界面主题切换源码分享"是一个实现Android应用主题切换...

    android theme 皮肤主题 的应用

    总结,Android主题和皮肤主题的应用涉及资源文件的管理、XML样式定义、代码中主题的设置和切换、第三方库的利用,以及动态主题切换和皮肤包的打包分发。理解并掌握这些知识点,将有助于开发出更加美观、个性化的...

    Android利用Theme自定义Activity间的切换动画

    接着定义`fade`样式,它继承自`@android:style/Animation.Activity`,并设置四个与Activity切换相关的动画属性,分别是打开进入、打开退出、关闭进入和关闭退出的动画资源: ```xml &lt;style name="fade" parent="@...

    安卓通过theme实现窗体切换动画

    android:theme="@style/AppTheme.WindowTransition" /&gt; ``` 这样,当`KingAnimationActivity`启动或退出时,就会应用我们定义的淡入淡出动画了。 然而,值得注意的是,从Android 3.0(API级别11)开始,`android:...

Global site tag (gtag.js) - Google Analytics