0

У меня есть пользовательский DialogFragment, который содержит два виджета DatePicker (от и до, используя layout/custom_date_picker).Как изменить раскладку DialogFragment при повороте экрана в Android

enter image description here

мне нужно изменить расположение dialogFragment при повороте экрана на альбомную (с использованием макета земли/custom_date_picker).

enter image description here

Конфигурация Activity является:

<activity 
     android:name=".activities.MainActivity" 
     android:configChanges="orientation|keyboardHidden|screenSize" 
     android:launchMode="singleTop"/> 

Внедренная DialogFragment источник:

public class DatePickerDialog extends DialogFragment 
{ 

public static final String START_SEARCH_DATE = "startSearchDate"; 
public static final String END_SEARCH_DATE = "endSearchDate"; 
private CustomDatePicker dpStartDate; 
private CustomDatePicker dpEndDate; 
private AlertDialog d; 

public interface DatePickerDialogListener 
{ 
    void onFinishDatePickDialog(String fromDate, String toDate); 
} 

public DatePickerDialog() 
{ 
} 

// Use this instance of the interface to deliver action events 
DatePickerDialogListener mListener; 

// Override the Fragment.onAttach() method to instantiate the DatePickerDialogListener 
@Override 
public void onAttach(Activity activity) 
{ 
    super.onAttach(activity); 
    // Verify that the host activity implements the callback interface 
    try 
    { 
     // Instantiate the NoticeDialogListener so we can send events to the host 
     mListener = (DatePickerDialogListener) activity; 
    } catch (ClassCastException e) 
    { 
     // The activity doesn't implement the interface, throw exception 
     throw new ClassCastException(activity.toString() + " must implement DatePickerDialogListener"); 
    } 
} 

public static DatePickerDialog newInstance(String startSearchDate, String endSearchDate) 
{ 
    DatePickerDialog frag = new DatePickerDialog(); 
    Bundle args = new Bundle(); 
    args.putString(START_SEARCH_DATE, startSearchDate); 
    args.putString(END_SEARCH_DATE, endSearchDate); 
    frag.setArguments(args); 
    return frag; 
} 

@NonNull 
@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) 
{ 
    View customView = getActivity().getLayoutInflater().inflate(R.layout.custom_date_picker, null); 
    // Define your date pickers 
    dpStartDate = (CustomDatePicker) customView.findViewById(R.id.dpStartDate); 
    dpEndDate = (CustomDatePicker) customView.findViewById(R.id.dpEndDate); 

    String startSearchDate = getArguments().getString(START_SEARCH_DATE); 
    String endSearchDate = getArguments().getString(END_SEARCH_DATE); 

    dpStartDate.updateDate(startSearchDate); 
    dpEndDate.updateDate(endSearchDate); 

    d = new AlertDialog.Builder(getActivity()) 
      .setView(customView) 
      .setTitle(getString(R.string.datepicker_hint)) 
      .setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() 
      { 
       @Override 
       public void onClick(DialogInterface dialog, int which) 
       { 

       } 
      }) //Set to null. We override the onclick 
      .setNegativeButton(getString(R.string.cancel), null) 
      .create(); 
    d.show(); 
    d.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 

      boolean b = DateUtils.largerThanEndDate(dpStartDate, dpEndDate); 
      if (b) 
      { 
       ToastUtils.showShortText(getActivity(), getString(R.string.date_error)); 
      } else 
      { 
       mListener.onFinishDatePickDialog(dpStartDate.getDate(), dpEndDate.getDate()); 
       dismiss(); 
      } 
     } 
    }); 
    return d; 
} 
} 

Может кто-нибудь, пожалуйста, руководство меня, каким образом это можно сделать? Заранее спасибо.

Edit: Вот код, с которым я призываю DialogFragment:

public void showDatePicker() 
{ 
    startSearchDate = dateModel.getStartDate(); 
    endSearchDate = dateModel.getEndDate(); 
    datePickerDialog = (DatePickerDialog)fragmentManager.findFragmentByTag(DATE_PICKER_DIALOG); 

    if (alertDialog == null) 
    { 
     alertDialog = DatePickerDialog.newInstance(startSearchDate, endSearchDate); 
     alertDialog.show(fragmentManager, DATE_PICKER_DIALOG); 
    } 

} 
+0

@ Y.S.Теперь я нажимаю кнопку и показываю диалог, но макет не может быть изменен при повороте экрана. –

ответ

1

Я полагаю, вы могли бы рассмотреть возможность использования if пункт в вашем onCreate() следующим образом:

int rotation = getWindowManager().getDefaultDisplay().getRotation(); 

, а затем do

switch(rotation){ 
    case Surface.ROTATION_0: 
    case Surface.ROTATION_180: 
     // show portrait 

    case Surface.ROTATION_90: 
    case Surface.ROTATION_270: 
     // show landscape 
} 

Для портретного режима отобразите два диалоговых окна. И для ландшафтного режима, покажите их бок о бок.

EDIT:

Answering поточечно:

  • При вращении телефона, то Activity обязательно воссоздан. Это означает, что onCreate()будет называться. Следовательно, вращение состояние может быть определено в onCreate(), как показано выше. В этом случае введите rotation поле члена класса, чтобы к нему можно было получить доступ по всему классу.
  • Действительно, как вы правильно указываете, диалог можно отобразить либо из , либо в onCreate(). Для этого и для сохранения состояния экземпляра см. Прикрепленные ссылки.

Ссылки:

1.How to properly retain a DialogFragment through rotation?.

2.Why won't Fragment retain state when screen is rotated?.

+0

Я думаю, что я должен показать диалог в методе onConfigurationChanged, но я не уверен, как изменить макет диалога и сохранить состояние datepicker. –

+0

см. Отредактированный ответ :) –

+0

Спасибо за информацию. Я прочитал ссылки, но не могу решить свою проблему. Пожалуйста, см. Мой отредактированный. Как я могу изменить макет диалога (просто вызов showDatePicker() не может работать должным образом) из метода onConfigurationChanged? –