プログラムでアクティビティのテーマを変更する


121

特定の場合、ダイアログテーマをアクティビティから削除する必要がありますが、機能していないようです。ここに例があります

最初のアクティビティ:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    startActivity(new Intent(MainActivity.this, SecondActivity.class));
}

2番目のアクティビティ:

public void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setTheme(android.R.style.Theme);
    setContentView(R.layout.activity_second);
}

マニフェストの抜粋:

 <activity android:name="SecondActivity" android:theme="@android:style/Theme.Dialog"></activity>

実行すると、ダイアログがテーマになります。

API10

ありがとう。

回答:


183

ドキュメントは、あなたが呼び出す必要がありますと言うsetTheme任意のビュー出力の前に。そのようであるsuper.onCreate()に参加するview処理。

したがって、テーマを動的に切り替えるには、setTheme次のsuper.onCreateように前に呼び出すだけです。

public void onCreate(Bundle savedInstanceState) {
    setTheme(android.R.style.Theme);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_second);
}

スタックAndroid 5.1搭載のMotoG(v1)で動作します。それが機能しない場合は、device + androidバージョンを共有してください。
lenrok258 2016年

:ここで説明したように、私はテーマを定義する必要がありました stackoverflow.com/a/44236460/3211335をそしてこの答えによって説明されるように設定します。それは素晴らしい働きをします。
LaloLoop 2017

とにかく、テーマをページごとに設定する代わりに、テーマを一度だけ設定できますか
gayan1991

共有設定を使用してテーマを保存しますが、アプリを再起動すると、最初のテーマが表示され、次に2番目のテーマが表示されます。
Mohammad Afrashteh

1
@ gayan1991あなたのテーマを定義するために、他のアクティビティを使用し、すべてのあなたの活動はこの1つの例を拡張するほか作ることができます。pastebin.com/r93qrRDG書式を良く持っている利用ペーストビン:編集を
SocialSupaCrew

46

user1462299の応答は適切に機能しますが、フラグメントを含めると、元のアクティビティテーマが使用されます。すべてのフラグメントにもテーマを適用するには、代わりにContextのgetTheme()メソッドをオーバーライドできます

@Override
public Resources.Theme getTheme() {
    Resources.Theme theme = super.getTheme();
    if(useAlternativeTheme){
        theme.applyStyle(R.style.AlternativeTheme, true);
    }
    // you could also use a switch if you have many themes that could apply
    return theme;
}

onCreate()メソッドでsetTheme()を呼び出す必要はもうありません。この方法で、このコンテキスト内の現在のテーマを取得するすべてのリクエストをオーバーライドしています。


2
@誰もが反対票を投じた:私の返答についてあなたが嫌い​​なことを説明するのは気になりますか?
ビョルンKechel

getTheme()は、アクティビティまたはそれぞれのフラグメントでオーバーライドする必要がありますか?これをアクティビティに実装しましたが、フラグメントはまだ元のアクティビティテーマを使用しています。
saltandpepper

@saltandpepperアクティビティでオーバーライドするだけで十分です。フラグメントコードとレイアウトで再度変更しないようにしてください。
ビョルンケッシェル2018年

これは私にはうまくいきませんでしたが、stackoverflow.com / a / 15496425/494179で提供された答えはうまくいきました。
saltandpepper

2
良い点はuser1269737なので、重い計算がないことを確認する必要があります。単純な条件ケース内でスタイルを返すだけでは、パフォーマンスには影響しません。
ビョルンKechel

12

私は遅れていることを知っていますが、ここに解決策を投稿したいと思い ます
完全なソースコードをここで確認してください。
これは、設定を使用してテーマを変更するときに使用したコードです。

SharedPreferences pref = PreferenceManager
        .getDefaultSharedPreferences(this);
String themeName = pref.getString("prefSyncFrequency3", "Theme1");
if (themeName.equals("Africa")) {
    setTheme(R.style.AppTheme);



} else if (themeName.equals("Colorful Beach")) {
    //Toast.makeText(this, "set theme", Toast.LENGTH_SHORT).show();
    setTheme(R.style.beach);


} else if (themeName.equals("Abstract")) {
    //Toast.makeText(this, "set theme", Toast.LENGTH_SHORT).show();

    setTheme(R.style.abstract2);

} else if (themeName.equals("Default")) {

    setTheme(R.style.defaulttheme);

}

setcontentviewの前にコードを配置する必要があることに注意してください。

ハッピーコーディング!


どうして?答えは正しいですか?
dondondon 2015年

共有設定を使用してテーマを保存しますが、アプリを再起動すると、しばらくの間、最初のテーマが表示され、次に2番目のテーマが表示されます。
Mohammad Afrashteh

0

これは私にとってはうまくいきます:

theme.applyStyle(R.style.AppTheme, true)

使用法:

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    //The call goes right after super.onCreate() and before setContentView()
    theme.applyStyle(R.style.AppTheme, true)
    setContentView(layoutId)
    onViewCreated(savedInstanceState)
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.