Принудительно закрыть всплывающее окно Android при изменении ориентации на книжную во время выполнения, почему?

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

    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:/Пожалуйста, помогите, так как я так долго работаю над этим и не получаю зацепка. Я был бы очень благодарен вам всем. Спасибо!

P.S.: Изменение ориентации означает, что я нажимаю ctrl+F11 и меняю ориентацию эмулятора.


person noobnicks    schedule 04.03.2012    source источник
comment
вам не нужно использовать handler.postDelayed для открытия всплывающего окна, поскольку оно связано с событием onClick. Это требуется только тогда, когда вы показываете его автоматически при загрузке активности. Таким образом, в onClick вы также можете просто вызвать openCalendar().   -  person waqaslam    schedule 04.03.2012
comment
Нет, это не плохое программирование. Используйте его, если он работает хорошо для вас :)   -  person waqaslam    schedule 04.03.2012


Ответы (2)


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

android:configChanges="keyboard|keyboardHidden"

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

person Ted Hopp    schedule 04.03.2012
comment
@noobnicks — добавление этого атрибута будет означать, что ваша активность не будет перезапускаться при изменении состояния клавиатуры, но она все равно будет перезапускаться при изменении ориентации. Это все, что вам нужно, потому что (из того, что вы описали) ваша деятельность не использует ресурсы, которые меняются в зависимости от состояния клавиатуры. (P.S. Если это решит вашу проблему, вы можете отметить мой ответ как решение, нажав на галочку.) - person Ted Hopp; 04.03.2012

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

person Rashmi.B    schedule 06.03.2012