2012-05-10 4 views
5

У меня в настоящее время возникают проблемы с DialogFragments. Я использую последние пакеты поддержки v.4 (версия 8, я считаю) Моя проблема заключается в том, что если ориентация моего телефона меняется, когда диалог открыт, приложение начинает действовать странно.Диалог -фрагмент Ориентация Изменение Сбой с getActivity()

В настоящее время моя заявка работает следующим образом: Существует фрагментация, она вызывает фрагмент. Этот фрагмент затем вызывает DialogFragment (через getActivity(). GetSupportFragmentManager().

При изменении ориентации в то время как диалог открыт, getActivity() в Fragment = NULL. Это вызывает проблему, если я хочу закончить активность и т.д.

Чтобы вызвать этого откройте диалоговое окно, изменить ориентацию и нажмите кнопку только после того, как вы нажмете на кнопку он выходит из строя

Мой 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

Вы воссоздавать все вместо того, чтобы использовать связку. Добавьте if в свой onCreateDialog, чтобы проверить нулевой пакет. Если это нулевое значение, сделайте свой материал для создания, иначе ничего не сделайте, и Android восстановит все из комплекта.

Я думаю, что исправит вашу проблему.

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

Вы должны понимать жизненный цикл деятельности. Каждый раз, когда вы вращаете устройство, активность воссоздается. Это означает, что выполняется новый экземпляр класса.

Что происходит в вашем коде, так это то, что после поворота слушатель вызывает getActivity в предыдущем экземпляре диалога, ссылаясь на предыдущее действие. Но эта деятельность уже недействительна, она была «разрушена» после поворота, и появилась новая.

Вы звоните в getActivity больше не действителен.

Не можете ли вы закрыть открытый диалог во время фрагмента onDestroy?

1

Вы можете отменить свое диалоговое окно в onPause() и использовать условное выражение для проверки и отображения() диалога в onCreate(). Это может быть более уместным в onStop() или onDestroy() в зависимости от вашего конкретного варианта использования.

Смежные вопросы