Приложение зависало при выборе списка предпочтений
У меня есть настройки активности.
public class SettingsActivity extends Activity {
private static final String TAG="SettingsActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getFragmentManager().beginTransaction()
.replace(android.R.id.content, new MyPreferencesFragment())
.commit();
Log.d(TAG,"onCreate");
}
@Override
public void onBackPressed() {
finish();
super.onBackPressed();
}
}
У меня есть PreferenceFragment, который присоединяется к этой деятельности настройки.
public class MyPreferencesFragment extends PreferenceFragment implements
android.content.SharedPreferences.OnSharedPreferenceChangeListener {
private static final String TAG = "MyPreferencesFragment";
private static final String[] values = { "send updates all the time",
"send updates if the power is 30 percent or more(recommended)",
"when plugged in to a power source",
"never send location updates(not recommended)" };
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
String key) {
Log.d(TAG, "onSharedPreferenceChanged");
setSummary();
}
@Override
public void onResume() {
super.onResume();
Log.d(TAG, "onResume");
getPreferenceScreen().getSharedPreferences()
.registerOnSharedPreferenceChangeListener(this);
setSummary();
}
public void setSummary() {
ListPreference pref = (ListPreference) findPreference(getString(R.string.string_key_location_settings));
SharedPreferences sharedPref = PreferenceManager
.getDefaultSharedPreferences(getActivity());
if (pref != null) {
pref.setSummary(values[Integer.valueOf(sharedPref.getString(
getString(R.string.string_key_location_settings), "")) - 1]);
}
}
}
когда я впервые нажимаю на настройки и выбираю элемент списка, он работает нормально, а когда я возвращаюсь снова, нажимаю на настройки, приложение вылетает или, по крайней мере, происходит сбой активности настроек. Журнал ошибок говорит 1.03-17 14:06:16.250: E/AndroidRuntime(28476): java.lang.IllegalStateException: Fragment MyPreferencesFragment{397eb568} not attached to Activity
Приложение не вылетает автоматически, когда я открываю действие настроек, но когда я нажимаю на настройки списка и выбираю один из элементов списка, то есть точно в setSummary(). Но это происходит не в первый раз, когда я открываю настройки, а в следующий раз, когда я открываю настройку активности и выбираю элемент списка, происходит сбой
Мой журнал ошибок
03-17 14:49:13.211: E/AndroidRuntime(25871): java.lang.IllegalStateException: Fragment MyPreferencesFragment{3add3d7c} not attached to Activity
03-17 14:49:13.211: E/AndroidRuntime(25871): at android.app.Fragment.getResources(Fragment.java:788)
03-17 14:49:13.211: E/AndroidRuntime(25871): at android.app.Fragment.getString(Fragment.java:810)
03-17 14:49:13.211: E/AndroidRuntime(25871): at com.example.clickforhelp.controllers.MyPreferencesFragment.onSharedPreferenceChanged(MyPreferencesFragment.java:36)
03-17 14:49:13.211: E/AndroidRuntime(25871): at android.app.SharedPreferencesImpl$EditorImpl.notifyListeners(SharedPreferencesImpl.java:476)
03-17 14:49:13.211: E/AndroidRuntime(25871): at android.app.SharedPreferencesImpl$EditorImpl.apply(SharedPreferencesImpl.java:384)
03-17 14:49:13.211: E/AndroidRuntime(25871): at android.preference.Preference.tryCommit(Preference.java:1403)
03-17 14:49:13.211: E/AndroidRuntime(25871): at android.preference.Preference.persistString(Preference.java:1436)
03-17 14:49:13.211: E/AndroidRuntime(25871): at android.preference.ListPreference.setValue(ListPreference.java:147)
03-17 14:49:13.211: E/AndroidRuntime(25871): at android.preference.ListPreference.onDialogClosed(ListPreference.java:282)
03-17 14:49:13.211: E/AndroidRuntime(25871): at android.preference.DialogPreference.onDismiss(DialogPreference.java:391)
03-17 14:49:13.211: E/AndroidRuntime(25871): at android.app.Dialog$ListenersHandler.handleMessage(Dialog.java:1257)
03-17 14:49:13.211: E/AndroidRuntime(25871): at android.os.Handler.dispatchMessage(Handler.java:102)
03-17 14:49:13.211: E/AndroidRuntime(25871): at android.os.Looper.loop(Looper.java:135)
03-17 14:49:13.211: E/AndroidRuntime(25871): at android.app.ActivityThread.main(ActivityThread.java:5312)
03-17 14:49:13.211: E/AndroidRuntime(25871): at java.lang.reflect.Method.invoke(Native Method)
03-17 14:49:13.211: E/AndroidRuntime(25871): at java.lang.reflect.Method.invoke(Method.java:372)
03-17 14:49:13.211: E/AndroidRuntime(25871): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
03-17 14:49:13.211: E/AndroidRuntime(25871): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
1 ответ
Переместите свой код из onCreate
в onActivityCreated
вместо того, чтобы пытаться получить активность в onCreate
Добавьте фрагмент к вашей активности как
FragmentTransaction fragTrans = getFragmentManager().beginTransaction();
fragTrans.replace(android.R.id.content, new PreferenceFragment()).commit();