Изменение темы активности программно
В особых случаях мне нужно удалить тему диалога из моей активности, но она, похоже, не работает. Вот пример
Первая активность:
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
Спасибо.
Ответы
Ответ 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)
}