在Android运行时更改并应用主题

在Android运行时更改并应用主题,android,themes,android-activity,android-theme,Android,Themes,Android Activity,Android Theme,可能重复: 我有一个Android应用程序,允许用户在运行时切换主题。切换一个主题很容易,但我找到了一种方法,但如果用户按下后退按钮,以前的屏幕仍然有旧的主题。如何更改这些活动的主题?支持它的应用程序示例:我想这只是一个提示: 在finish()之前呼叫 setResult(AnIntegerThatNotifiesThePreviousActivitiesToChangeTheme); 现在,在所有活动中,实现onActivityResult protected void onActivi

可能重复:

我有一个Android应用程序,允许用户在运行时切换主题。切换一个主题很容易,但我找到了一种方法,但如果用户按下后退按钮,以前的屏幕仍然有旧的主题。如何更改这些活动的主题?支持它的应用程序示例:

我想这只是一个提示:

finish()之前呼叫

setResult(AnIntegerThatNotifiesThePreviousActivitiesToChangeTheme);
现在,在所有活动中,实现onActivityResult

protected void onActivityResult(int request, int result, Intent data) {
    if(result == AnIntegerThatNotifiesThePreviousActivitiesToChangeTheme)
    {
        //update the current theme
    }
}

另一个解决方案(更好):

实现一个保存主题的类:

public class CurrentThemeHolder {
    private CurrentThemeHolder() {
    }
    private static instance;
    public static getInstance() {
        if(instance == null)
            return new CurrentThemeHolder();
        else
            return instance;
    }
    private int mTheme; //identifier of the theme
    public getTheme() {
        return mTheme;
    }
    public setTheme(int newTheme){
        mTheme = newTheme;
    }
}
现在,让我们的所有活动扩展此主题活动:

public class ThemeActivity extends Activity {
    private int mTheme;
    protected void onResume() {
        if(mTheme != CurrentThemeHolder.getInstance().getTheme()) {
            //do what you should do to set the theme
            mTheme = CurrentThemeHolder.getInstance().getTheme();
            //everytime you set the theme save it
            //this maybe should be done in onCreate()
        }
    }
}

在运行时,在调用setContentView()之前,在活动的onCreate()方法中动态调用setTheme()。要更改主题,只需重新启动活动

请看

还想看看和。。。
希望这对…有帮助

重新启动活动适用于当前活动,但当用户单击“上一步”按钮时,以前的活动仍然具有旧主题。这是因为用户返回时未调用onCreate,因此我无法设置主题。您希望将主题设置为永久,然后与live wallpaper相同制作一个应用程序,然后在设置中可以添加不同的样式@乔治:这并不能回答这个问题。重新启动活动适用于当前显示的活动,但当用户单击“上一步”时,如何将其应用于其他活动?@Giorgi使用
starActivityForResult()
从主活动调用辅助活动。当辅助活动返回时,将自动调用主活动的
onActivityResult()
方法。对于主题更改,您可以向主活动返回“结果代码”,以便它知道必须更改主题。如前所述,主题更改需要重新创建活动。对于“后退”按钮,覆盖辅助活动的
onBackPressed()
方法,以便它首先构建返回主活动的意图,然后调用
finish()
以结束辅助活动。hello sherif,我想从你们那个里知道,是否有任何解决方案可以让我从网络上获取颜色代码,并且根据我可以在运行时更改所有按钮的颜色,而不必去所有特定的按钮并应用背景色,是否有任何使用主题或样式的解决方案?请分享你的建议。你有无限的颜色吗?或者只是一组有限的颜色?比如说,我确实有有限的20种颜色,但这20种颜色是从服务器上下载的,所以可能会随时间变化,简言之,颜色大约是15-20(不是固定的),这些颜色代码也不是固定的。其中一位用户建议使用CustomView