2

我正在尝试使用 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);
        }
    }

我还尝试在覆盖 onResume() 函数后调用 setSettingsTheme() 函数仍然没有用。Log.i存在于 setSettingsTheme() 函数中总是给出正确的值。任何人都可以帮助我理解。提前致谢,考希克

4

2 回答 2

7

的文档ContextThemeWrapper.setTheme(int)说:

为此上下文设置基本主题。请注意,这应该在任何视图被实例化Context之前调用(例如在调用setContentView(View)or之前inflate(int, ViewGroup))。

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

于 2012-11-12T14:46:05.860 回答
0

首先,向 Raffaele 致敬,因为他在这方面为我指明了正确的方向。

另外,我知道这是一个旧帖子,所以如果现在有更好的方法可以做到这一点,请告诉我。

反正...

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

例如:(在您的活动中某处......)

 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.

再次,我在 Moto360 上的表盘服务上做了这个,没有发生任何事故。我还没有在 Activity 上尝试过这个。

Resources.Theme.applyStyle(int,boolean)

您可以在此处查看我的代码(BatmanWatchFaceService.java)

于 2016-01-06T13:47:18.413 回答