У меня есть настройки PreferenceFragment
, которые позволяют пользователю выбирать тему. Пользователь может выбрать темную или светлую тему. После выбора темы пользователь нажимает кнопку «Назад», чтобы вернуться к предыдущему фрагменту. Это вызывает метод onCreate содержащего действия, в котором тема читается и применяется. Однако тема применяется неправильно, при переключении с Holo.Light на Holo.Dark изменяется цвет фона, панель действий и т. д., но не изменяется текст, что приводит к блеклому, трудночитаемому тексту. Любые идеи, что я делаю неправильно? Все, что я прочитал, говорит о том, что тема должна применяться в методе onCreate, что я и делаю.
Заранее спасибо за помощь.
ИЗМЕНИТЬ
В соответствии с запросом здесь находится соответствующий код.
public class MainActivity extends Activity {
private ActionBarDrawerToggle mSlideMenuToggle;
private boolean isDarkTheme;
private static final String InitializedKey = "initialized";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
applySettings();
setContentView(R.layout.activity_main);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (mSlideMenuToggle.onOptionsItemSelected(item)) {
return true;
} else if (item.getItemId() == R.id.menu_settings) {
getFragmentManager().beginTransaction()
.replace(R.id.content_frame, new SettingsFragment())
.addToBackStack(null)
.commit();
return true;
} else {
return super.onOptionsItemSelected(item);
}
}
private void applySettings() {
isDarkTheme = PreferenceManager.getDefaultSharedPreferences(this).getString(SettingsFragment.ThemeSetting, null).equals("1");
if (isDarkTheme) {
setTheme(android.R.style.Theme_Holo);
} else {
setTheme(android.R.style.Theme_Holo_Light);
}
}
Метод onCreate
применяет текущую тему к активности, вызывая applySettings
. Меню параметров позволяет создать SettingsFragment
.
public class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener {
public static final String ThemeSetting = "isDarkTheme";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals(ThemeSetting)) {
String[] themes = getResources().getStringArray(R.array.isDarkThemeStrings);
findPreference(key).setSummary(sharedPreferences.getString(key, "").equals("0") ? themes[0] : themes[1]);
}
}
@Override
public void onResume() {
super.onResume();
PreferenceManager.getDefaultSharedPreferences(getActivity()).registerOnSharedPreferenceChangeListener(this);
}
@Override
public void onPause() {
super.onPause();
PreferenceManager.getDefaultSharedPreferences(getActivity()).unregisterOnSharedPreferenceChangeListener(this);
}
}
SettingsFragment
имеет одну настройку, Тема, которая может иметь одно из двух значений: Темная или Светлая. Пользователь выбирает один и затем нажимает кнопку «Назад». Это вызывает вызов метода onCreate
из MainActivity
, снова применяя настройки, но не правильно.
Кто угодно? Мне кажется, что после изменения темы в SettingsFragment
и нажатия кнопки «Назад» тема должна быть применена к MainActivity
, но это не так. Большинство элементов меняются, но текст остается темным (переход от Holo.Light к Holo.Dark).
PreferenceFragment
вPreferenceActivity
вместо обычного)? Так же проблема с текстом тоже дляActionBar
или только для просмотров(если таковые используются)? - person user   schedule 23.07.2013SettingsFragment
). Итак, чтобы ответить на ваш вопрос, нет, я не заканчиваю работу, так как на самом деле это просто для хранения моих фрагментов. МетодonCreate
вызывается при выходе изSettingsFragment
, поэтому тема применяется так, как если бы активность была воссоздана. Верно? Это неправильный подход к предпочтениям? - person shortspider   schedule 23.07.2013Context
при их создании (которая будет контекстом действия, а не чем-то вродеgetApplicationContext()
). Я должен признать, что я не понимаю, как вызываетсяonCreate()
после того, как вы нажмете назад, который должен просто вытолкнуть SettingsFragment (вы сами это называете). Предпочтения должны быть реализованы в их собственной деятельности (PreferenceActivity
). - person user   schedule 23.07.2013R.color.white
или чего-то подобного. - person tbruyelle   schedule 23.07.2013getActivity
, а неgetApplicationContext
, поэтому я не думаю, что это все. Говорит ли Google где-нибудь, чтоPreferenceActivity
нужно/следует использовать? Насколько я понимаю, большинство вещей нужно делать с помощьюFragments
? - person shortspider   schedule 23.07.2013