2011-09-01 12 views
45

Androidでは、アクティビティの現在のテーマをResource.ThemeオブジェクトとしてgetTheme()から取得できます。また、他のテーマのリソースID(setTheme(R.style.Theme_MyTheme)など)を使用してテーマを別のテーマに設定することもできます。Android:現在のテーマのリソースIDを取得するには?

しかし、それが価値があるかどうか、現在のテーマがすでに設定したいテーマであるかどうかをどのようにして知ることができますか?

protected void onResume() { 
    int newThemeId = loadNewTheme(); 
    if (newThemeId != getTheme().getResourceId()) { // !!!! How to do this? 
     setTheme(newThemeId); 
     // and rebuild the gui, which is expensive 
    } 
} 

任意のアイデア:私のような何かを書くために、getTheme().getResourceId()のようなものを探していますか?ここ

+0

私はリソースIDがテーマクラスの寄稿者だとは思わない。テーマはreource xmlファイルから作成される可能性がありますが、IDへの参照は失われます。テーマそのものが変更される可能性があり、特定のリソースIDと結びつけることは意味を持ちません。さらに、テーマはオンザフライでコード内に作成できます。現在のテーマにはどのリソースIDが使用されたのかを把握しておく必要があります。 – Anderson

+0

この回答が役に立ちます。これをチェックアウトしてくださいhttp://stackoverflow.com/a/26302184/4639479 –

答えて

34

OKは1つのパズルのピースです:私たちは、その活動のためのgetPackageManager().getActivityInfo(getComponentName(), 0).themeとして、AndroidManifest.xmlに設定されているように、アプリケーションレベルで設定したテーマについてcontext.getApplicationInfo().themeとして、そして活動の中から、デフォルトテーマを得ることができます。

私は、カスタムgetTheme()setTheme()の独自のラッパーを行うための出発点を与えてくれると思います。

でも、ではなく、の周りに働くように感じます。だから誰かがより良いアイデアを思いついているかどうかを知るために質問を開いたままにしておきます。

+0

これについての感想はこちらと+1です。 –

+12

'Context'に' getThemeResId() 'メソッドがありますが残念ながらpublicではありません:-( –

27

リソースIDを取得せずに要件を解決する方法が見つかりました。

私は、文字列の名前と私のテーマのそれぞれに項目を追加している:

<item name="themeName">dark</item> 

そして、私はそうのような名前をチェックコードに:

TypedValue outValue = new TypedValue(); 
getTheme().resolveAttribute(R.attr.themeName, outValue, true); 
if ("dark".equals(outValue.string)) { 
    ... 
} 
+1

<! - これを使うにはattr.xmlファイルにテーマ名の参照を追加しなければなりませんでした。 - > TouchBoarder

+1

これは本当に創造的なアイデアです。ありがとう! – LoungeKatt

7

あり反射を介してこれを行う方法。あなたの活動でこれを入れて:

int themeResId = 0; 
try { 
    Class<?> clazz = ContextThemeWrapper.class; 
    Method method = clazz.getMethod("getThemeResId"); 
    method.setAccessible(true); 
    themeResId = (Integer) method.invoke(this); 
} catch (NoSuchMethodException e) { 
    Log.e(TAG, "Failed to get theme resource ID", e); 
} catch (IllegalAccessException e) { 
    Log.e(TAG, "Failed to get theme resource ID", e); 
} catch (IllegalArgumentException e) { 
    Log.e(TAG, "Failed to get theme resource ID", e); 
} catch (InvocationTargetException e) { 
    Log.e(TAG, "Failed to get theme resource ID", e); 
} 
// use themeResId ... 

[挿入免責事項をここで非パブリックAPIについて]

+0

正常に動作しています。 –

3

sourcesによるActivity.setThemeがActivity.onCreate前に呼び出され、Androidはそれを設定するときにthemeIdを保存することができますので、 :

public class MainActivity extends Activity { 
    private int themeId; 

    @Override 
    public void setTheme(int themeId) { 
     super.setTheme(themeId); 
     this.themeId = themeId; 
    } 

    public int getThemeId() { 
     return themeId; 
    } 
} 
関連する問題