Android setTheme函数在resume上不起作用

Android setTheme函数在resume上不起作用,android,android-theme,Android,Android Theme,我正在尝试使用setTheme函数,它基本上是基于一些DB值来设置主题,但问题是,一旦我用要设置的主题更新了DB,我需要完成()要实现的主题设置的活动。守则是— @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); settingsDBAdapter = new SettingsDBAdapter(this);

我正在尝试使用setTheme函数,它基本上是基于一些DB值来设置主题,但问题是,一旦我用要设置的主题更新了DB,我需要完成()要实现的主题设置的活动。守则是—

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        settingsDBAdapter = new SettingsDBAdapter(this);
        settingsDBAdapter.open();

        setSettingsTheme();  <<------THIS LINE WILL SET THEME
        setContentView(R.layout.layout_task_manager);

        quickAddButton = (Button) findViewById(R.id.QuickAddButtonId);
        quickAddTaskText = (EditText) findViewById(R.id.QuickAddEditTextId);

        mDBHelper = new TasksDBAdapter(this); 
        mDBHelper.open();


        fillData();
        //code to create long press on any list item and calls onCreateContextMenu method
        registerForContextMenu(getListView());
        registerButtonListenersAndSetDefaultText();


    }

public void setSettingsTheme(){
        String currentTheme = settingsDBAdapter.fetchThemeSettings("theme");
        Log.i(TAG,"settingsDBAdapter + currentTheme-->" + settingsDBAdapter + currentTheme);
        //setTheme(R.style.HoloTheme);
        if(currentTheme.trim().equalsIgnoreCase("holo")){
            Log.i(TAG, "in holo<<<<<<<<");
            setTheme(R.style.HoloTheme);
        }else if(currentTheme.trim().equalsIgnoreCase("hololight")){
            Log.i(TAG, "in hololight<<<<<<<");
            setTheme(R.style.HoloLightTheme);
        }else{
            Log.i(TAG, "iin else<<<<<<<");
            setTheme(R.style.HoloTheme);
        }
    }
@覆盖
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
settingsDBAdapter=新的settingsDBAdapter(本);
setingsdbadapter.open();
setSettingsTheme();的文档说明:

设置此上下文的基本主题。请注意,应调用 在
上下文中实例化任何视图之前(例如在
调用
setContentView(视图)
充气(int,ViewGroup)


主题
属性在
视图
的构造函数中读取,因此在更改主题后,您将需要重新创建UI。您可以调用
finish()
,然后调用
startActivity(getIntent())
在您的活动中重新启动它,或者必须编写一种方法来重建每个视图对象。

首先,请向Raffaele致敬,感谢他为我指明了正确的方向

另外,我知道这是一个老帖子,所以如果现在有更好的方法,请让我知道

无论如何

我在尝试为我的Moto360创建手表面板时遇到类似问题。您不能更改视图层次结构引用的主题实例,但可以强制该实例采用要切换到的主题的属性。如果您获得对主题的引用并调用
Resource.theme.applyStyle(int,boolean)
,目标主题的属性将应用于视图引用的主题。之后,调用使视图无效将使用新样式更新UI

例如:(活动中的某个地方…)

同样,我在Moto360上的一个手表表面服务上做了这件事,没有发生任何事故。我还没有在活动中尝试过这件事


您可以看到我的代码。

我通过调用finish()尝试了同样的方法如果用户单击“活动”上的“上一步”按钮。但这是实现的唯一方法吗?是的,是的。
视图
构造函数是查询
主题
对象的唯一位置。无法通知
视图
对象主题已重置。唯一的机会是使用自定义视图:在这种情况下,您可以提供可选回调以允许热交换主题。但是Android不提供这样的框架,setTheme()也应该在super.onCreate(savedInstanceState)之前;在Android 2.3上,我遇到了这个问题。每次调用setTheme()之后,您是否调用setContentView()?我只是调用finish()用户退出应用程序后,以及用户重新启动应用程序时,会调用应用程序setCOntentView()。是否仍要将其取消设置,以便用户无需重新启动应用程序。?因此,我在为我的Moto360创建手表面时遇到了类似的问题。无论是好是坏,我使用了以下选项:,布尔值)
 Resources.Theme myTheme = SomeActivity.this.getTheme();
 View myThemedView = SomeActivity.this.findViewById(R.id.myRootView);
 myTheme.applyStyle(R.style.MyOtherTheme,true);
 myThemedView.invalidate();
 // Above, "true" clobbers existing styles, "false" preserves them
 // and attempts to add in any new attributes.