133

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

最初のアクティビティ:

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

ありがとう。

4

5 に答える 5

208

ドキュメントにあるよう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);
}
于 2012-07-20T09:23:51.050 に答える
55

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() を呼び出す必要はなくなりました。このように、このコンテキスト内で現在のテーマを取得するために、すべてのリクエストをオーバーライドしています。

于 2016-08-25T16:24:04.590 に答える
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..の前にコードを配置する必要があることに注意してください。

ハッピーコーディング!

于 2015-10-23T15:11:33.723 に答える