不要使用预编译的主题

时间:2012-08-02 22:12:40

标签: android android-theme

是否可以创建Theme而不是预先编译有限数量的主题(意味着两者操作系统附带的主题和资源xml)?该主题将在应用程序启动期间根据用户配置应用(值在运行时更改,但在创建样式化活动之前,值来自大范围而非集合的http服务)。

欢迎任何其他解决方案,直到它需要在任何地方使用自定义的View类。

我现在需要的是设置全局默认的TextView文本颜色,当然我不想在任何地方使用子类,我认为失去优化没有巨大的灾难,或者至少看起来很棒性能差异。

2 个答案:

答案 0 :(得分:1)

在您的活动中覆盖ContextThemeWrapper.getTheme(),并提供您自己的Theme

或者在调用super.onCreate之前在Activity.onCreate中应用预定义主题,提供自己的主题资源ID:

@Override
public void onCreate(Bundle si){
   setTheme(R.style.MyTheme);
   super.onCreate(si);
}

首选在xml样式文件中使用主题。您可以继承某些系统主题,并仅覆盖所需的属性。 style.xml的示例:

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <style name="MyTheme" parent="android:Theme.Holo">
      <item name="android:textColorPrimary">#0f0</item>
   </style>
</resources>

样式和主题功能强大,但缺乏深入的文档,也没有高级工具。

答案 1 :(得分:1)

嗯,这可能有点过于讨厌,但这是一个镜头。

public class BaseActivity extends Activity{

    @Override
    public void onResume() {
        ViewGroup root = ((ViewGroup)findViewById(android.R.id.content));
        applyTheme(root);
    }

    private void applyTheme(View view){
        if (view instanceof ViewGroup && ((ViewGroup) view).getChildCount() !=0){
            for (int i = 0; i< ((ViewGroup) view).getChildCount(); i++){
                applyTheme(((ViewGroup) view).getChildAt(i));
            }
        } else {
            if (view instanceof TextView){
                ((TextView) view).setTextColor(your_color_from_server_here);
            }
        }
    }
}

让您的所有活动都扩展到BaseActivity。