2012-05-10 21 views
5

現在、DialogFragmentsにいくつか問題があります。 私は最新のv.4サポートパッケージを使用しています(私は信じているリビジョン8) 私の問題は、ダイアログが開いている間に携帯電話の向きが変わると、アプリケーションがwierdの動作を開始するということです。DialogFragment Orientation GetActivity()でクラッシュする変更

現在、私のアプリケーションは次のように動作します。 FragmentActivityがあり、Fragmentを呼び出します。 次いで、この断片をgetActivity()を介してDialogFragmentを(呼び出します。getSupportFragmentManager()。

ダイアログが開いている間の向きを変更した場合、私がしたい場合は、フラグメント=ヌルでgetActivity()。 はこれが問題になりますこれはあなたがダイアログを開きせるになど

活動を終了し、向きを変更し、ボタンを押してくださいあなたはそれが

マイDialogFragmentが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(); 
} 
} 
を私はこれを引き起こしていただきました、あまりにもわからないんだけど

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

これはフラグメントのですか?申し訳ありません、そのばかげた質問。私は他の場所で「Windows Leaking」について読んできましたが、私はlogcatでそのことについて何の言及も見ていません。

は、誰も私を助けることができます:)その大歓迎

ありがとうございますが、すべてを再作成する代わりに、バンドルを使用している

答えて

0

。 onCreateDialogにifを追加して、ヌルバンドルを確認します。それがnullの場合は、あなたの作成物を行い、それ以外の場合は何もしないで、Androidはバンドルからすべてを復元します。

私はあなたの問題を解決すると思います。

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

アクティビティのライフサイクルを理解する必要があります。デバイスを回転するたびに、アクティビティが再作成されます。これは、クラスの新しいインスタンスが実行されていることを意味します。

あなたのコードで何が起こるかは、ローテーションの後、以前のアクティビティを参照して、前のダイアログインスタンスでgetActivityを呼び出します。しかし、この活動はもう有効ではありません。回転後に "破壊され"、新しいものが現れました。

getActivityを呼び出すと、もう有効ではありません。

フラグメントonDestroyメソッドで開いているダイアログを閉じることができませんか?

1

onPause()でダイアログを閉じ、onCreate()でダイアログをチェックしてshow()することができます。これは、特定のユースケースに応じて、onStop()またはonDestroy()でより適切かもしれません。

@Override 
protected void onPause() { 
    if (myDialog != null && myDialog.isVisible()) 
     myDialog .dismiss(); 
    super.onPause(); 
} 
関連する問題