2012-05-10 7 views
5

J'ai actuellement quelques problèmes avec DialogFragments. J'utilise les derniers paquets de support v.4 (Révision 8 je crois) Mon problème est, que si l'orientation de mon téléphone change pendant que la boîte de dialogue est ouverte, l'application commence à agir wierd.Orientation de DialogFragment Changer de crash avec getActivity()

Actuellement, mon application fonctionne comme ceci: Il y a une FragmentActivity, elle appelle un fragment. Ce fragment appelle ensuite un DialogFragment (via getActivity(). GetSupportFragmentManager().

Si les changements d'orientation alors que le dialogue est ouvert, le getActivity() dans le Fragment = null. Cela pose un problème si je veux terminer l'activité, etc.

Pour provoquer ce que vous ouvrez la boîte de dialogue, changer l'orientation et appuyer sur un bouton seulement après avoir appuyé sur le bouton, il se bloque

Mon DialogFragment est appelé AlertDialogFragment.

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

C'est le 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(); 
} 
} 

Je ne suis pas trop sûr ce qui est la cause? Désolé si c'est une question stupide. J'ai lu dans d'autres endroits à propos de 'Windows fuit', mais je n'ai pas vu de mention de ce genre de choses dans logcat.

Quelqu'un peut-il me aider :) Ses grandement appréciés

Merci

Répondre

0

Vous recréez tout au lieu d'utiliser le faisceau. Ajoutez un if à votre onCreateDialog pour rechercher un ensemble nul. Si c'est nul, faites vos trucs de création, sinon ne faites rien et Android restaurera tout de l'ensemble.

Je pense que cela va résoudre votre problème.

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

Vous devez comprendre le cycle de vie de l'activité. Chaque fois que vous faites pivoter l'appareil, l'activité est recréée. Cela signifie qu'une nouvelle instance de la classe est en cours d'exécution. Ce qui se passe dans votre code, c'est que, après une rotation, l'écouteur appelle getActivity sur une instance de boîte de dialogue précédente, en se référant à l'activité précédente. Mais cette activité n'est plus valide, elle a été "détruite" après la rotation et une nouvelle est apparue.

Vous appelez getActivity n'est plus valide. Vous ne pouvez pas fermer votre boîte de dialogue ouverte pendant la méthode fragment onDestroy?

1

Vous pouvez fermer votre boîte de dialogue dans onPause() et utiliser une condition pour vérifier et afficher() la boîte de dialogue onCreate(). Cela peut être plus approprié dans onStop() ou onDestroy() en fonction de votre cas d'utilisation spécifique.

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