简体   繁体   English

应用在选择列表首选项时崩溃

[英]app chrashed on selecting list preference

I have settings activity. 我有设置活动。

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

}

I have a PreferenceFragment that attaches to this settings activity. 我有一个附加到此设置活动的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]);
        }
    }

}

when I first click on settings and select a list item it works fine and when I go back again click on settings the app crashes or atleast the settings activity crashes. 当我第一次单击设置并选择一个列表项时,它可以正常工作;当我再次返回时,单击设置,应用程序崩溃,或者至少设置活动崩溃。 The error log says 1.03-17 14:06:16.250: E/AndroidRuntime(28476): java.lang.IllegalStateException: Fragment MyPreferencesFragment{397eb568} not attached to Activity 错误日志显示1.03-17 14:06:16.250: E/AndroidRuntime(28476): java.lang.IllegalStateException: Fragment MyPreferencesFragment{397eb568} not attached to Activity

The app does not automatically crash when I open the settings activity but when I click on the list settings and select one of the list items ie exactly at setSummary(). 当我打开设置活动时,但当我单击列表设置并选择列表项之一时,即恰好在setSummary()时,该应用程序不会自动崩溃。 But It does not happen the first time when I open settings but from the next time whenever I open settings activity and select a list item it crashes 但是,第一次打开设置不会发生这种情况,但是下次打开设置活动并选择一个列表项时,它会崩溃

My error log 我的错误日志

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)

Move your code from onCreate to onActivityCreated instead of trying to getActivity at onCreate 将代码从onCreate移到onActivityCreated而不是尝试在onCreate上进行getActivity

Add the fragment to your activity as 将片段添加为您的活动为

FragmentTransaction fragTrans = getFragmentManager().beginTransaction();
fragTrans.replace(android.R.id.content, new PreferenceFragment()).commit();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM