Как сохранить и применить пользовательские настройки с помощью ListPreferences?
Что я на самом деле пытаюсь сделать, это изменить макет и цвет фона текста, как только пользователь выберет соответствующую опцию из моей ListPreference
public class PrefFragment extends PreferenceFragment implements OnPreferenceChangeListener {
private static final String PREF_THEME="themeset";
ListPreference theme_selector;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
theme_selector = (ListPreference) findPreference(PREF_THEME);
theme_selector.setOnPreferenceChangeListener(this);
};
public boolean onPreferenceChange(Preference preference, Object newValue) {
return true;
}
}
это мой фрагмент предпочтений
это мои предпочтения.xml
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<ListPreference
android:key="themeset"
android:entries="@array/themeselection"
android:summary="@string/pref_theme_summary"
android:entryValues="@array/themeValues"
android:title="@string/pref_themes"
android:defaultValue="1"/>
это мой array.xml
<resources>
<string-array name="themeselection">
<item name="Black">Black</item>
<item name="White7">White</item>
</string-array>
<string-array name="themeValues">
<item name="Black">1</item>
<item name="White">2</item>
</string-array>
</resources>
ниже моя основная деятельность
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.graphics.Color;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.RelativeLayout;
import android.widget.TextView;
public class MainActivity extends Activity implements OnSharedPreferenceChangeListener {
private int theme_setting;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RelativeLayout theme =(RelativeLayout) findViewById(R.id.layout);
TextView txtcolor = (TextView) findViewById(R.id.txt);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
prefs.registerOnSharedPreferenceChangeListener(this);
theme_setting = Integer.parseInt((prefs.getString("themeset", "1")));
if (theme_setting == 1)
{
theme.setBackgroundColor(Color.parseColor("#000000"));
txtcolor.setTextColor(Color.parseColor("#FFFFFF"));
this.recreate();
}
else
{
theme.setBackgroundColor(Color.parseColor("#FFFFFF"));
txtcolor.setTextColor(Color.parseColor("#000000"));
this.recreate();
}
}
@Override
public void onSharedPreferenceChanged(SharedPreferences arg0, String arg1) {
if (arg1.equals("themeValues"))
{
theme_setting = Integer.parseInt((arg0.getString("themeset", "1")));
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_settings:
Intent i = new Intent(this, PrefSummary.class);
startActivityForResult(i,1);
break;
}
return true;
}
}
Итак, как я уже говорил, все, что я хочу сделать, - это просто изменить тему, программно установив / изменив цвет фона и цвет шрифта макета, и для приведенного выше кода я получаю замороженный белый экран приложения, как если бы макет не загружался. Я понимаю, что я сделал что-то ужасно неправильное, главным образом, в основной деятельности, и я хотел бы получить некоторую помощь, чтобы заставить это работать.
1 ответ
Я понял, что код "this.recreate" вызывает бесконечный цикл, и поэтому я написал много дерьмового кода, думая, что это ошибка настроек предпочтений. Ниже я покажу немного более чистый и работающий код:
Измененный фрагмент предпочтений:
public class PrefFragment extends PreferenceFragment {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);};}
В основной деятельности
1.Удаленный или прокомментированный this.recreate() в if... else.
2.Modified
public void onSharedPreferenceChanged(SharedPreferences arg0, String arg1) {
if (arg1.equals("themeValues"))
{
theme_setting = Integer.parseInt((arg0.getString("themeset", "1")));
}
в
public void onSharedPreferenceChanged(SharedPreferences arg0, String arg1) {
this.recreate();//So the recreate function will be called only once and only when a change is detected.
}
Наконец, ответ здесь не на заданный вопрос (потому что в начале не было никаких проблем), виновником была функция refreshate (), а не использование SharedPreferences или ListPreferences.