2013-03-31 13 views
9

Oto moja PreferenceActivity (klasa Wewnętrzna mojego Główna działalność)Nie można wykonać tę czynność po onSaveInstanceState (preferencji onClick)

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

    } 

Oto mój onPreferenceClick:

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

I tu jest moje FragmentClass (TimePicker):

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

PROBLEM:

Kiedy klikam od preferencji (zdefiniowane w formacie XML), a kiedy uchwyt onClick (ja pokazując TimePickerDialogonClick) mam następujący wyjątek:

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) 

punktów błędach kod do metody show() w metodzie onPreferenceClick.

Dlaczego tak się dzieje i jak mogę to naprawić?

EDIT:

Prefs.xml złożyć

<?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> 

Co próbowałem:

Próbowałem rozwiązania z największą liczbą głosów, które znalazłem tutaj 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. 
} 

Ale nadal nie jest działa. Nawet na API < 11. Wciąż otrzymuję już wspomniany wyjątek.

+0

Pokaż ten plik pref.xml –

+0

Edytowałem moje pytanie. Wciąż nie znalazłem rozwiązania tego problemu. – rootpanthera

+0

Spróbuj tego kodu http://www.mediafire.com/?muvaeodxz2mj36k –

Odpowiedz

1

Wychodzisz na kawałku kończyny tutaj:

// 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; 
} 

Kluczem będąc getFragmentManager()

Zapewnia, że ​​używasz FragmentManager związanego z TestSettings działalności. Mam wrażenie, że używasz instancji FragmentManager z MainActivity (widzisz, że TestSettings jest wewnętrzną klasą MainActivity, to nie jest tak szalone z przypuszczenia ... może).

+0

Masz rację. Używam getFragmentManager() z mojej MainActivity, która jest najwyższej klasy. Mam zagnieżdżone klasy TestSettings (rozszerza aktywność preferencji). Czy to niewłaściwe podejście, czy ...? Ponieważ nadal nie znalazłem rozwiązania tego problemu. – rootpanthera

+0

Nie używaj FragmentManger z MainActivity w swojej aktywności TestSettings. Instancje FragmentManager są powiązane z ich działaniami i odpowiadającymi im cyklami życia. –

Powiązane problemy