【问题标题】:Can not perform this action after onSaveInstanceState (onClick preference)在 onSaveInstanceState(onClick 首选项)之后无法执行此操作
【发布时间】:2013-03-21 18:51:26
【问题描述】:

这是我的PreferenceActivity(我的主要活动的内部类)

public static class TestSettings extends PreferenceActivity implements Preference.OnPreferenceClickListener{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.pref);
        getPreferenceManager().findPreference("key").setOnPreferenceClickListener(this);

    }

这是我的onPreferenceClick

@Override
public boolean onPreferenceClick(Preference preference) {
    FragmentClass fc = new FragmentClass();
    fc.show(fm, "TAG");
    return false;
}

这是我的FragmentClassTimePicker 对话框):

public class FragmentClass extends DialogFragment implements TimePickerDialog.OnTimeSetListener {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return new TimePickerDialog(getActivity(), this, 15, 00, false);
    }


    @Override
    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
        Log.i("APP", "hour: "+hourOfDay+", min: "+minute);
    }
}

问题:

当我点击首选项(在 XML 中定义),当我处理 onClick(我正在显示 TimePickerDialog onClick)时,我得到了以下异常:

  03-21 10:06:41.325: E/AndroidRuntime(11003): FATAL EXCEPTION: main
03-21 10:06:41.325: E/AndroidRuntime(11003): java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
03-21 10:06:41.325: E/AndroidRuntime(11003):    at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1327)
03-21 10:06:41.325: E/AndroidRuntime(11003):    at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1338)
03-21 10:06:41.325: E/AndroidRuntime(11003):    at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
03-21 10:06:41.325: E/AndroidRuntime(11003):    at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)
03-21 10:06:41.325: E/AndroidRuntime(11003):    at android.support.v4.app.DialogFragment.show(DialogFragment.java:127)
03-21 10:06:41.325: E/AndroidRuntime(11003):    at com.example.timepicker2.MainActivity$TestSettings.onPreferenceClick(MainActivity.java:110)
03-21 10:06:41.325: E/AndroidRuntime(11003):    at android.preference.Preference.performClick(Preference.java:951)
03-21 10:06:41.325: E/AndroidRuntime(11003):    at android.preference.PreferenceScreen.onItemClick(PreferenceScreen.java:215)
03-21 10:06:41.325: E/AndroidRuntime(11003):    at android.widget.AdapterView.performItemClick(AdapterView.java:298)
03-21 10:06:41.325: E/AndroidRuntime(11003):    at android.widget.AbsListView.performItemClick(AbsListView.java:1100)
03-21 10:06:41.325: E/AndroidRuntime(11003):    at android.widget.AbsListView$PerformClick.run(AbsListView.java:2749)
03-21 10:06:41.325: E/AndroidRuntime(11003):    at android.widget.AbsListView$1.run(AbsListView.java:3423)
03-21 10:06:41.325: E/AndroidRuntime(11003):    at android.os.Handler.handleCallback(Handler.java:725)
03-21 10:06:41.325: E/AndroidRuntime(11003):    at android.os.Handler.dispatchMessage(Handler.java:92)
03-21 10:06:41.325: E/AndroidRuntime(11003):    at android.os.Looper.loop(Looper.java:137)
03-21 10:06:41.325: E/AndroidRuntime(11003):    at android.app.ActivityThread.main(ActivityThread.java:5041)
03-21 10:06:41.325: E/AndroidRuntime(11003):    at java.lang.reflect.Method.invokeNative(Native Method)
03-21 10:06:41.325: E/AndroidRuntime(11003):    at java.lang.reflect.Method.invoke(Method.java:511)
03-21 10:06:41.325: E/AndroidRuntime(11003):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
03-21 10:06:41.325: E/AndroidRuntime(11003):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
03-21 10:06:41.325: E/AndroidRuntime(11003):    at dalvik.system.NativeStart.main(Native Method)

代码错误指向onPreferenceClick方法中的方法show()

为什么会发生这种情况,我该如何解决?

编辑:

Prefs.xml 文件

    <?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >


    <CheckBoxPreference android:title="Checkbox" android:summary="Checkbox"/>
    <EditTextPreference android:summary="time" android:dialogTitle="Hello"  />
    <Preference android:title="Prefff" android:key="key"/>
</PreferenceScreen>

我的尝试:

我已经尝试了大多数投票的解决方案,我在这里找到了 getting exception "IllegalStateException: Can not perform this action after onSaveInstanceState"

   @Override
protected void onSaveInstanceState(Bundle outState) {
    //No call for super(). Bug on API Level > 11.
}

但它仍然无法正常工作。甚至在 API

【问题讨论】:

  • 显示此文件 pref.xml
  • 我编辑了我的问题。我仍然没有找到解决方案。
  • 试试这个代码mediafire.com/?muvaeodxz2mj36k
  • @Mojo 您的代码似乎运行良好,但恐怕这不是我想要的。您的preference.xml 文件具有EditTextPreferences(内置对话框),并且其对话框始终可以正常工作。我正在创建自己的偏好(TimePicker 对话框),但它不起作用。
  • @rootpanthera 然后你使用 Shared Preferences 这在你的情况下是一个不错的选择

标签: java android illegalstateexception


【解决方案1】:

在这里有点勉强:

// this is in your TestSettings class
public boolean onPreferenceClick(Preference preference) {
    FragmentClass fc = new FragmentClass();
    // getFragmentManager() here ensures you are using the FragmentManager
    // associated with TestSettings activity and not your MainActivity
    fc.show(getFragmentManager(), "TAG");
    return false;
}

关键是 getFragmentManager()

确保您使用的是与 TestSettings Activity 关联的FragmentManager。我有一种感觉,您正在使用 MainActivity 中的 FragmentManager 实例(因为 TestSettings 是 MainActivity 的内部类,这并不是一个疯狂的猜测......也许)。

【讨论】:

  • 你是对的。我正在使用我的 MainActivity 中的 getFragmentManager() ,这是 TOP 类。我有嵌套类 TestSettings (扩展偏好活动)。这是错误的方法,还是..?因为我仍然没有找到解决方案。
  • 不要在 TestSettings 活动中使用 MainActivity 中的 FragmentManger。 FragmentManager 实例附加到它们的活动及其相应的生命周期。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-02
  • 2019-05-30
  • 2014-10-18
  • 2014-03-05
相关资源
最近更新 更多