Зачем закрывать всплывающее окно Android при изменении ориентации на портрет во время выполнения, почему? - PullRequest
0 голосов
/ 04 марта 2012

Вот моя ОСНОВНАЯ ДЕЯТЕЛЬНОСТЬ

    public static boolean popupStatus=false;
    public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    if (savedInstanceState != null){
    popupStatus = savedInstanceState.getBoolean("Open");
    } 
    setContentView(R.layout.main);

    public void onSaveInstanceState(Bundle savedInstanceState) {    

    savedInstanceState.putBoolean("Open", DateTimePicker.openPopup);
    super.onSaveInstanceState(savedInstanceState);
}

У меня есть DateTimePicker.java класс, который имеет 1 кнопку и 1 просмотр текста.При нажатии на кнопку мой другой класс Calendar.java заполняется в PopupWindow, и в этом всплывающем окне отображается мой класс Calendar.java.Я создал разные макеты моего класса Calendar.java для портретного и ландшафтного режима.Вот DateTimePicker.java некоторый фрагмент кода,

    public static boolean openPopup = false;

    textView = new TextView(this.getContext());
    this.addView(textView, layoutParams);
    button = new Button(this.getContext());
    button.setText("C");
    this.addView(button, layoutParams1);
    button.setOnClickListener(this);
    if(Main.popupStatus){
            button.performClick();
        }

    public void onClick(View v) {
    if(Main.popupStatus){
              new Handler().postDelayed(new Runnable() {
                    public void run() {
                        openCalendar();
                    }
                }, 100);
        }
        else{
            openCalendar();
        }

    private void openCalendar() {
    Calendar calendar = new Calendar(this.getContext());
    if(portrait.equals(orientation)){
        pw = new PopupWindow(calendarLayout, 245, 284, true);
    }
    else{
        pw = new PopupWindow(calendarLayout, 295, 240, true);
    }
    pw.setOutsideTouchable(false);
    pw.showAtLocation(this, Gravity.NO_GRAVITY, 10, 80);
    openPopup = true;
}

    public void closeCalendar(){
    pw.dismiss();
    openPopup = false;
        }

Main.XML содержит DateTimePicker.На самом деле я хотел, чтобы мое всплывающее окно открывалось даже при изменении ориентации во время выполнения, поэтому я сделал это с помощью установки флага openPopup = true; в методе openCalendar(), и если оно открывается и ориентация изменяется во время выполнения, этот флагбудет сохранен в методе onSaveInstanceState().После изменения ориентации она будет проверена в onCreate(), и откроется всплывающее окно для соответствующего режима ориентации.Я надеюсь, что вы поняли мою точку зрения.

ПРОБЛЕМА: Первоначально, когда я нажимаю кнопку в режиме Портрета, всплывающее окно появляется для макета портрета.затем, не закрывая всплывающее окно, я меняю ориентацию на альбомную.И после изменения я вижу мое всплывающее окно как неповрежденное и появляется на экране макета ландшафта.До сих пор работает нормально.Но если всплывающее окно открывается в ландшафтном режиме, а затем я меняю ориентацию на портрет, всплывающее окно макета портрета не появляется, и я вижу сообщение FORCE CLOSE: / Пожалуйста, помогите, так как я работаю за ним так долго и не получаюПодсказка.Я был бы очень благодарен всем вам.Спасибо!

PS: Изменение ориентации означает, что я нажимаю Ctrl + F11 и меняю ориентацию эмулятора

Ответы [ 2 ]

1 голос
/ 04 марта 2012

В эмуляторе есть странная особенность (некоторые считают это ошибкой), при которой при переходе от эмулятора к альбомному режиму два изменения конфигурации и два перезапуска вашей деятельности. (Одно изменение конфигурации - это ориентация, а другое - эмулированное изменение состояния клавиатуры.) Сроки изменения конфигурации часто приводят к таким сбоям. Попробуйте добавить этот атрибут:

android:configChanges="keyboard|keyboardHidden"

на ваш <activity> тег в манифесте. Посмотрим, улучшит ли это ситуацию.

0 голосов
/ 06 марта 2012

Убедитесь, что ваш макет определен в папке layout-land, и убедитесь, что onCreate не вызывается снова и снова.android: configChanges = "клавиатура | клавиатура скрытая" Поместите это в файл манифеста, чтобы сохранить состояние при изменении ориентации

...