java.lang.IllegalStateException: Kann nicht diese Aktion durchführen, nachdem onSaveInstanceState mit DialogFragment
Ich bin vor Problem mit DialogFragment /getSupportFragmentManager /Android-version 4.x
01-10 19:46:48.228: E/AndroidRuntime(9879): java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
01-10 19:46:48.228: E/AndroidRuntime(9879): at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1314)
01-10 19:46:48.228: E/AndroidRuntime(9879): at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1325)
01-10 19:46:48.228: E/AndroidRuntime(9879): at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:548)
01-10 19:46:48.228: E/AndroidRuntime(9879): at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:532)
01-10 19:46:48.228: E/AndroidRuntime(9879): at android.support.v4.app.DialogFragment.show(DialogFragment.java:127)
01-10 19:46:48.228: E/AndroidRuntime(9879): at com.v1.mypck.TermsAndConditions.showDialog(TermsAndConditions.java:256)
01-10 19:46:48.228: E/AndroidRuntime(9879): at com.v1.mypck.TermsAndConditions.handleMessage(TermsAndConditions.java:62)
01-10 19:46:48.228: E/AndroidRuntime(9879): at com.v1.mypck.TermsAndConditions$IncomingHandler.handleMessage(TermsAndConditions.java:53)
01-10 19:46:48.228: E/AndroidRuntime(9879): at android.os.Handler.dispatchMessage(Handler.java:99)
01-10 19:46:48.228: E/AndroidRuntime(9879): at android.os.Looper.loop(Looper.java:137)
01-10 19:46:48.228: E/AndroidRuntime(9879): at android.app.ActivityThread.main(ActivityThread.java:4441)
01-10 19:46:48.228: E/AndroidRuntime(9879): at java.lang.reflect.Method.invokeNative(Native Method)
01-10 19:46:48.228: E/AndroidRuntime(9879): at java.lang.reflect.Method.invoke(Method.java:511)
01-10 19:46:48.228: E/AndroidRuntime(9879): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
01-10 19:46:48.228: E/AndroidRuntime(9879): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
01-10 19:46:48.228: E/AndroidRuntime(9879): at dalvik.system.NativeStart.main(Native Method)
Im code unten, wenn ich die zurück-Taste drücken, versucht es zu beenden, derzeitige Tätigkeit und zurück zur vorherigen Tätigkeit, die er wirft obige Fehlermeldung.
Code funktioniert auch auf älterer version (vor 4.x).
Kann jemand mich führen, in die richtige Richtung.
public class TermsAndConditions extends SherlockFragmentActivity implements LoaderManager.LoaderCallbacks<JSONObject>{
static final String TAG = "TermsAndConditions";
private static int titleResource;
private static int messageResource;
private IncomingHandler handler = null;
private static final int SHOW_NETWORK_DIALOG = 3;
static class IncomingHandler extends Handler {
private final WeakReference<TermsAndConditions> mTarget;
IncomingHandler(TermsAndConditions target) {
mTarget = new WeakReference<TermsAndConditions>(target);
}
@Override
public void handleMessage(Message msg) {
TermsAndConditions target = mTarget.get();
if (target != null) {
target.handleMessage(msg);
}
}
}
public void handleMessage(Message msg) {
switch (msg.what) {
case SHOW_NETWORK_DIALOG:
titleResource = R.string.msg_alert_no_network_title;
messageResource = R.string.msg_alert_no_network_message;
showDialog();
break;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.web_view);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportLoaderManager().initLoader(0, null, this);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
private void loadViewData() {
//Logic to load content.
}
@Override
public Loader<JSONObject> onCreateLoader(int arg0, Bundle arg1) {
if (handler == null){
handler = new IncomingHandler(TermsAndConditions.this);
}
return new JsonLoader(this);
}
@Override
public void onLoadFinished(Loader<JSONObject> arg0, JSONObject jsonData) {
if(jsonDataObject==null || jsonDataObject.length()==0) {
handler.sendEmptyMessage(SHOW_NETWORK_DIALOG);
} else {
loadViewData();
}
}
@Override
public void onLoaderReset(Loader<JSONObject> arg0) {
if(jsonDataObject==null || jsonDataObject.length()==0) {
handler.sendEmptyMessage(SHOW_NETWORK_DIALOG);
} else {
loadViewData();
}
}
public static class JsonLoader extends AsyncTaskLoader<JSONObject> {
public JsonLoader(Context context) {
super(context);
}
@Override
protected void onStartLoading() {
if (jsonDataObject != null) {
deliverResult(jsonDataObject);
}
if (takeContentChanged() || jsonDataObject == null) {
forceLoad();
}
}
@Override
public JSONObject loadInBackground() {
try {
return response.getJSONObject("result");
} catch (JSONException e) {
return null;
} catch (Throwable e) {
return null;
}
}
@Override
public void deliverResult(JSONObject newJsonData) {
if (isReset()) {
if (jsonDataObject != null) {
onReleaseResources(jsonDataObject);
}
}
JSONObject oldData = jsonDataObject;
jsonDataObject = newJsonData;
if (isStarted()) {
super.deliverResult(jsonDataObject);
}
if (oldData != null) {
onReleaseResources(oldData);
}
}
@Override
protected void onStopLoading() {
cancelLoad();
}
@Override public void onCanceled(JSONObject jsonData) {
super.onCanceled(jsonData);
onReleaseResources(jsonData);
}
@Override protected void onReset() {
super.onReset();
onStopLoading();
if (jsonDataObject != null) {
onReleaseResources(jsonDataObject);
jsonDataObject = null;
}
}
protected void onReleaseResources(JSONObject jsonData) {
jsonData = null;
}
}
public static class MyAlertDialogFragment extends DialogFragment {
public static MyAlertDialogFragment newInstance(int title) {
MyAlertDialogFragment frag = new MyAlertDialogFragment();
Bundle args = new Bundle();
args.putInt("title", title);
frag.setArguments(args);
return frag;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
int title = getArguments().getInt("title");
return new AlertDialog.Builder(getActivity())
.setTitle(title)
.setMessage(messageResource)
.setPositiveButton(R.string.alert_dialog_ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
}
}
)
.create();
}
}
public void showDialog() {
DialogFragment newFragment = MyAlertDialogFragment.newInstance(titleResource);
newFragment.show(getSupportFragmentManager(), "my_dialog");
}
}
InformationsquelleAutor der Frage Yogesh | 2013-01-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist die Antwort in einem anderen thread:
Aktionen in onActivityResult und "Fehler Kann nicht diese Aktion durchführen, nachdem onSaveInstanceState"
auch hier:
Erfrischend mein fragment nicht, wie ich dachte, es sollte
Dies ist ein Beispiel, dieses problem zu lösen:
InformationsquelleAutor der Antwort Khaled Annajar
Ich habe das gleiche Problem und ich änderte den code wie unten
:
der fertige code funktioniert gut für mich, so brüllen, hoffen, dass Hilfe
InformationsquelleAutor der Antwort Tran Khanh Tung
Wohl, der handler, der reagiert auf die HandleMessage verbunden ist, um eine Aktivität zerstört.
d.h.: Wenn Sie drehen Sie den Bildschirm, der alten zerstörten Aktivität wird die Meldung verarbeiten, dann werden Sie rufen Sie die showDialog -, und die exception wird geworfen:
Erstellen Sie ein Dialogfeld, nachdem die alte zerstört Tätigkeit berufen hat, seine onSaveInstanceState.
Versuchen, anstelle der Rückruf, mit der die neue erstellt Aktivität, um sicherzustellen, dass Sie erstellen, ist der dialog immer in die lebendige Aktivität.
Wenn Sie nicht dreht, setzen Sie ein flag auf onSaveInstance wie "speichern", und deaktivieren Sie es auf onRestoreInstance. In Ihrem handleMessage-Methode, wenn das flag "speichern" ist, zeigen nicht den dialog, schalten Sie es einfach ein anderes flag, das anzeigt, dass der dialog, die erstellt werden müssen, auf onResume. Dann auf onResume-Methode, prüfen Sie, ob in der Mitte des Prozesses, sollten Sie das Dialogfeld erstellen, wenn ja, zeigen Sie es auf der onResume-Methode.
InformationsquelleAutor der Antwort noni
Dem Ziel, die post () - Methode in diesem Fall ist zu warten, während onResume() von Activity oder Fragment beendete.
Es funktioniert, wenn Sie wollen, um zu zeigen, DialogFragment von Fragment., f.e. wenn Sie möchten, zeigen Sie Ihren dialog nach einem system-dialog abgewiesen.
InformationsquelleAutor der Antwort MAKS
War ich vor dem gleichen Problem bei der post verzögern Runnables handler.postDelayed(Runnable runnable, lange verzögert).
Habe ich das problem auf diese Weise:
InformationsquelleAutor der Antwort user2832184
zu spät Antwort, aber vielleicht die richtige Antwort.
Ich machte einen übergeordneten Klasse und und dialog-fragment erstreckt sich von it -
}
InformationsquelleAutor der Antwort mostafa hashim
onPostResume()
verwenden Sie den post-resume-Methode, um Ihre Arbeit zu erledigen..
Ich denke, dass Sie anrufen Karte-dialog-Methode onRestart oder onResume, so vermeiden Sie es und verwenden Sie onPostResume() zu zeigen, Ihren dialog.
InformationsquelleAutor der Antwort Vikas Kumbhar
Könnte man überprüfen, ob die aktuelle Tätigkeit isActive() und nur in diesem Fall starten Sie das fragment Transaktion von DialogFragment. Ich hatte ein ähnliches problem und diese Prüfung gelöst mein Fall.
InformationsquelleAutor der Antwort box
Funktioniert es:
Aber aber noch immer schlecht, da erhielt den Fehler "Aktivität zerstört wurde"
Also meine Lösung ist, fügen Sie
if (!isFinishing()&&!isDestroyed())
auf schließen:
InformationsquelleAutor der Antwort Serg Burlaka
In der Aktivitätvor dem anzeigen der dialog können Sie so etwas tun
Dieser arbeitete für mich.
InformationsquelleAutor der Antwort Rino