2

基本的に何らかのDB値に基づいてテーマを設定するsetTheme関数を使用しようとしていますが、問題は、設定するテーマでDBを更新した後、テーマ設定を実装するためのアクティビティをfinish()する必要があることです。コードは-

@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.isetSettingsTheme()関数に存在すると、常に適切な値が得られます。誰かが私の理解を助けてくれませんか。よろしくお願いします、カウシク

4

2 に答える 2

7

のドキュメントにContextThemeWrapper.setTheme(int)は次のように書かれています:

このコンテキストの基本テーマを設定します。これは、 でビューがインスタンス化される前に呼び出す必要があることに注意してくださいContext(たとえば、setContentView(View)またはを呼び出す前inflate(int, ViewGroup))。

Theme属性は s コンストラクターで読み取られるためView、テーマを変更した後、UI を再作成する必要があります。finish()その後、Activity で呼び出しstartActivity(getIntent())て再起動するか、すべての View オブジェクトを再構築する方法をコーディングする必要があります。

于 2012-11-12T14:46:05.860 に答える
0

まず、これについて正しい方向に向けてくれた Raffaele に感謝します。

また、これは古い投稿であることはわかっているので、これを行うより良い方法があれば教えてください。

ともかく...

Moto360 のウォッチフェイスを作成しようとして、同様の問題に遭遇しました。ビュー階層によって参照されるテーマ インスタンスを変更することはできませんが、切り替え先のテーマの属性をそのインスタンスに適用させることはできます。テーマへの参照を取得して を呼び出すとResource.Theme.applyStyle(int,boolean)、ターゲット テーマの属性が View によって参照されるテーマに適用されます。その後、ビューを無効にする呼び出しにより、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 のウォッチフェイス サービスで問題なく実行しました。私はまだアクティビティでこれを試していません。

Resources.Theme.applyStyle(int,boolean)

私のコードはここ (BatmanWatchFaceService.java) で見ることができます。

于 2016-01-06T13:47:18.413 に答える