Подтвердить что ты не робот

Изменение темы активности программно

В особых случаях мне нужно удалить тему диалога из моей активности, но она, похоже, не работает. Вот пример

Первая активность:

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

Второе действие:

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

Спасибо.

4b9b3361

Ответ 1

Как docs говорят, что вы должны вызывать 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);
}

Ответ 2

user1462299 ответ отлично работает, но , если вы включаете фрагменты, они будут использовать оригинальную тему деятельности. Чтобы применить тему ко всем фрагментам, вы можете переопределить метод 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;
}

Вам больше не нужно вызывать setTheme() в методе onCreate(). Вы переопределяете каждый запрос, чтобы получить текущую тему в этом контексте таким образом.

Ответ 3

Я знаю, что я опаздываю, но я бы хотел опубликовать решение здесь:
Проверьте полный исходный код здесь.
Это код, который я использовал при изменении темы с использованием настроек.

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.

СЧАСТЛИВЫЙ КОДИРОВАНИЕ!

Ответ 4

Этот работает хорошо для меня:

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)
}