如何在所有按钮上以编程方式应用主题?

时间:2016-01-01 04:19:10

标签: android themes

这是我的按钮:

public class ChimmerButton extends Button {

public ChimmerButton(Context context) {
    super(context);
}

public ChimmerButton(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public ChimmerButton(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

/*
 * This method is used to apply the external font
 */
public void setTypeface(Typeface tf, int style) {
    if (!isInEditMode()) {
        super.setTypeface(Typeface.createFromAsset(
                getContext().getAssets(), "calibre-regular.ttf"));
    }
}
}

如何使用上面的代码在所有chimmerButtons上应用Theme.Light.NoTitleBar.Fullscreen?对此有什么解决方案吗?

3 个答案:

答案 0 :(得分:1)

  

请注意,应在实例化任何视图之前调用此方法   Context(例如在调用setContentView(View)或之前)   inflate(int,ViewGroup))。

从:

http://developer.android.com/reference/android/view/ContextThemeWrapper.html#setTheme%28int%29

不幸的是,您必须在显示活动之前设置主题。

因此,您不能拥有由运行时代码驱动的“动态”主题(尽管上面的注释显示了如何为按钮创建自定义主题)

答案 1 :(得分:0)

ContextThemeWrapper themedContext;

public ChimmerButton(ContextThemeWrapper themedContext) {
    This.themedContext = themedContext;
}  

if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ) {
    themedContext = new ContextThemeWrapper( Activity.this, android.R.style.Theme_Holo_Light_Dialog_NoActionBar );
}
else {
    themedContext = new ContextThemeWrapper( Activity.this, android.R.style.Theme_Light_NoTitleBar );

答案 2 :(得分:0)

按钮的主题默认情况下依赖于上下文。因此,不要为按钮设置主题,而是为包含按钮的活动设置主题。这是一个更容易的解决方案。

Apply a theme to an activity in Android?