2012-05-10 7 views
5

Ich habe momentan Probleme mit DialogFragments. Ich benutze die neuesten v.4 Support-Pakete (Revision 8 glaube ich) Mein Problem ist, dass, wenn die Ausrichtung meines Telefons ändert, während der Dialog geöffnet ist, beginnt die Anwendung wierd zu handeln.DialogFragment Orientierungswechsel Crash mit getActivity()

Derzeit funktioniert meine Anwendung so: Es gibt eine FragmentActivity, es nennt ein Fragment. Dieses Fragment ruft dann eine DialogFragment (via getActivity(). GetSupportFragmentManager().

Wenn die Ausrichtung ändert, während der Dialog geöffnet ist, die getActivity() im Fragment = null. Dies verursacht ein Problem, wenn ich will beenden die Aktivität usw.

verursachen diese Sie den Dialog öffnen, ändern Sie die Orientierung und eine Taste drücken Erst wenn Sie die Taste drücken, stürzt

Mein DialogFragment ist AlertDialogFragment genannt.

public class AlertDialogFragment extends DialogFragment { 
private static Builder mBuilder; 
private static DialogInterface.OnClickListener mListener; 

public static AlertDialogFragment newInstance(Context context, DialogInterface.OnClickListener listener) { 
    mBuilder = new AlertDialog.Builder(context); 
    mListener = listener;  
    return new AlertDialogFragment(); 
} 

//... some functions to set Icons etc 

public void setButton(int whichButton, CharSequence buttonText) { 
    final DialogInterface.OnClickListener listener = mListener == null ? null : mListener;  
    mBuilder.setPositiveButton(buttonText, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int whichButton) { 
       listener.onClick(dialog, whichButton); 
      } 
    }); 
} 

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    return mBuilder.create(); 
} 
} 
Diese

ist das Fragment:

public class TestBedFragment extends Fragment implements DialogInterface.OnClickListener { 
// onCreateView Stuff 

private void showCrashDialog() { 
    FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction(); 
    AlertDialogFragment newDialog = AlertDialogFragment.newInstance(getActivity(), this); 
    newDialog.setTitle("Test");  
    newDialog.setIcon(android.R.drawable.ic_dialog_alert); 
    newDialog.setMessage("Testing testing testing... 1, 2, 3... Just press Ok."); 
    newDialog.setButton(DialogInterface.BUTTON_POSITIVE, "Ok"); 
    newDialog.show(ft, "dialog"); 

    // Cause the problem. Simulate the user turning the screen 
    getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
    getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
} 

@Override 
public void onClick(DialogInterface dialog, int which) { 

    /* 
    * hexnumber = a hex number 
    * Normally equals: TestBedFragment{hexnumber #0 id=hexnumber} 
    * With crash equals: TestBedFragment{hexnumber} 
    */ 
    Log.e("TestBedFragment", "this = " + this); 

    /* 
    * hexnumber = a hex number 
    * Normally equals: [email protected] 
    * With crash equals: null 
    */ 
    Log.e("TestBedFragment", "getActivity() = " + getActivity()); // Will equal null... ??? 

    getActivity().finish(); 
} 
} 

Ich bin nicht sicher, was dies verursacht? Tut mir leid, wenn es eine dumme Frage ist. Ich habe an anderen Stellen über 'Windows Leaking' gelesen, aber ich habe noch nie erwähnt, dass diese Dinge in Logcat.

Kann mir jemand helfen :) Sein sehr geschätzt

Dank

Antwort

0

Du alles neu zu erstellen, anstatt das Bündel zu verwenden. Fügen Sie Ihrem onCreateDialog einen if hinzu, um nach einem Nullpaket zu suchen. Wenn es NULL ist, mach dein Erstellungskram, sonst tu nichts und Android stellt alles aus dem Bundle wieder her.

Ich denke, das wird Ihr Problem beheben.

if(SavesIinstanceState == null); { 
    // your code 
} 
1

Sie müssen Activity Life Cycle verstehen. Jedes Mal, wenn Sie das Gerät drehen, wird die Aktivität neu erstellt. Dies bedeutet, dass eine neue Instanz der Klasse ausgeführt wird.

In Ihrem Code passiert Folgendes: Nach einer Drehung ruft der Listener getActivity für eine vorherige Dialoginstanz auf und verweist auf die vorherige Aktivität. Aber diese Aktivität ist nicht mehr gültig, sie wurde nach der Rotation "zerstört" und eine neue erschien.

Sie rufen auf getActivity ist nicht mehr gültig.

Können Sie Ihren geöffneten Dialog während der Fragment-onDestroy-Methode nicht schließen?

1

Sie können Ihren Dialog in onPause() schließen und eine Bedingung verwenden, um den Dialog in onCreate() zu überprüfen und anzuzeigen(). Je nach Anwendungsfall ist dies möglicherweise in onStop() oder onDestroy() sinnvoller.

@Override 
protected void onPause() { 
    if (myDialog != null && myDialog.isVisible()) 
     myDialog .dismiss(); 
    super.onPause(); 
} 
Verwandte Themen