2013-03-31 13 views
9

Ecco il mio PreferenceActivity (classe interna della mia attività principale)non può eseguire questa azione dopo onSaveInstanceState (onClick preferenza)

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

    } 

Ecco il mio onPreferenceClick:

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

E qui è la mia FragmentClass (Dialogo 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); 
    } 
} 

PROBLEMA:

Quando clicco su preferenze (definiti in XML), e quando mi occupo onClick (sto mostrando TimePickerDialogonClick) mi sono seguente eccezione:

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) 

punti di errore codice al metodo show() nel metodo onPreferenceClick.

Perché ciò accade e come posso risolvere questo problema?

EDIT:

prefs.xml presentare

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

che cosa ho provato:

Ho provato la soluzione con il maggior numero di voti, che ho trovato qui 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. 
} 

Ma non è ancora di lavoro. Neanche sull'API < 11. Sto ancora ricevendo un'eccezione già menzionata.

+0

mostra questo file pref.xml –

+0

Ho modificato la mia domanda. Non ho ancora trovato una soluzione a questo. – rootpanthera

+0

Prova questo codice http://www.mediafire.com/?muvaeodxz2mj36k –

risposta

1

Andando su un po 'di un arto qui:

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

La chiave è getFragmentManager()

assicura che si sta utilizzando il FragmentManager associato alla TestSettings attività. Ho la sensazione che stai usando l'istanza FragmentManager da MainActivity (visto che TestSettings è una classe interna di MainActivity questo non è da pazzi per un'ipotesi ... forse).

+0

Hai ragione. Sto usando getFragmentManager() dal mio MainActivity che è di prima classe. Ho nested TestSettings di classe (estende l'attività di preferenza). È l'approccio sbagliato o ..? Perché non ho ancora trovato una soluzione a questo. – rootpanthera

+0

Non utilizzare FragmentManger dal MainActivity nell'attività di TestSettings. Le istanze di FragmentManager sono collegate alle loro attività e ai loro cicli di vita corrispondenti. –

Problemi correlati