Закрыть Android PopupWindow при переключении на новую вкладку в TabActivity? - PullRequest
2 голосов
/ 19 ноября 2010

У меня есть MapActivity как одна из четырех вкладок в TabActivity. Это MapActivity может запускать PopupWindow, которое является легендой. Всплывающее окно остается на экране в верхней части карты до тех пор, пока кнопка «Показать легенду» не будет нажата снова (назад и вперед и т. Д.).

Проблема в том, что когда пользователь переключается на другую вкладку, всплывающее окно остается постоянным в представлении.

Я пытался реализовать метод onPause () в классе MapActivity и от него отказаться. Приложение силы закрывается с этим методом на месте.

Любая помощь? Спасибо!

РЕДАКТИРОВАТЬ: Вот некоторые из моего кода:

В MainActivity, которая устанавливает четыре вкладки:

    Resources res = getResources(); // Resource object to get Drawables
    TabHost tabHost = getTabHost();  // The activity TabHost
    TabHost.TabSpec spec;  // Reusable TabSpec for each tab
    Intent intent;  // Reusable Intent for each tab

    // Create an Intent to launch an Activity for the tab (to be reused)
    intent = new Intent().setClass(this, FirstActivity.class);

    // Initialize a TabSpec for each tab and add it to the TabHost
    spec = tabHost.newTabSpec("game").setIndicator("First",
                      res.getDrawable(R.drawable.ic_tab_game))
                  .setContent(intent);
    tabHost.addTab(spec);

    // Do the same for the other tabs
    intent = new Intent().setClass(this, SecondActivity.class);
    spec = tabHost.newTabSpec("alerts").setIndicator("Second",
                      res.getDrawable(R.drawable.ic_tab_alert))
                  .setContent(intent);
    tabHost.addTab(spec);

    intent = new Intent().setClass(this, MapActivity.class);
    spec = tabHost.newTabSpec("map").setIndicator("Map",
                      res.getDrawable(R.drawable.ic_tab_map))
                  .setContent(intent);
    tabHost.addTab(spec);

    intent = new Intent().setClass(this, LastActivity.class);
    spec = tabHost.newTabSpec("experience").setIndicator("Last",
                      res.getDrawable(R.drawable.ic_tab_experience))
                  .setContent(intent);
    tabHost.addTab(spec);

    tabHost.setCurrentTab(0);

Теперь в моем классе MapActivity (который расширяет MapActivity):

    // Declare the Legend PopupWindow
    mapLegendInflater = (LayoutInflater) MapActivity.this
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    mapLegendPopupLayout = mapLegendInflater.inflate(
            R.layout.maptablegendpopuplayout, null, false);
    mapLegendPopup = new PopupWindow(mapLegendPopupLayout,
            (int) (0.45 * getApplicationContext().getResources()
                    .getDisplayMetrics().widthPixels),
            (int) (0.33 * getApplicationContext().getResources()
                    .getDisplayMetrics().heightPixels), true);
    mapLegendPopup.setFocusable(false);
    mapLegendPopup.setOutsideTouchable(true);

            Boolean legendIsShown = false;

    mapLegendButton = (Button) findViewById(R.id.buttonMapLegend);
    mapLegendButton.setOnClickListener(mapLegendListener);


private OnClickListener mapLegendListener = new OnClickListener() {
    public void onClick(View v) {
        // Launch or dismiss the map legend popup
        if (legendIsShown) {
            mapLegendPopup.dismiss();
            mapLegendButton.getBackground().clearColorFilter();
            legendIsShown = false;
        } else {
            mapLegendPopup.showAtLocation(
                    findViewById(R.id.buttonMapLegend), Gravity.TOP
                            | Gravity.LEFT, 8,
                    (int) (0.23 * getApplicationContext().getResources()
                            .getDisplayMetrics().heightPixels));
            mapLegendButton.getBackground().setColorFilter(
                    new LightingColorFilter(0xFFFFFFFF, 0xFFAA0000));
            // mapLegendButton.getBackground().setColorFilter(0xFFFFFF00,
            // PorterDuff.Mode.MULTIPLY);
            legendIsShown = true;
        }
    }
};

Надеюсь, это дает представление о том, где я нахожусь. Все отлично работает на вкладке Карта. Только когда у вас есть Легенда, показанная и переключающая вкладки, она все еще отображается в других представлениях.

Ответы [ 3 ]

3 голосов
/ 03 июля 2012

Я знаю, что вы сказали, что реализация onPause () не работает для вас, но я попробовал это, и реализация onResume () и onPause () в MapActivity работает для меня.View.post (new Runnable () {...}) в onResume (), поскольку я не мог воссоздать popupWindow во время onResume (), поэтому мне пришлось запланировать его немедленное выполнение:

2 голосов
/ 28 февраля 2012

Вы можете начать всплывающее окно, как это:

mapLegendPopup = new PopupWindow(this);
mapLegendPopup.setContentView (itemizeView);
mapLegendPopup.setBackgroundDrawable (new BitmapDrawable()); // key is here
mapLegendPopup.setWidth ((int) (0.45 * getApplicationContext().getResources()
                    .getDisplayMetrics().widthPixels));
mapLegendPopup.setHeight((int) (0.33 * getApplicationContext().getResources()
                    .getDisplayMetrics().heightPixels));
mapLegendPopup.setFocusable(false);
mapLegendPopup.setOutsideTouchable(true);
1 голос
/ 19 ноября 2010

Вы должны управлять своими диалогами, используя метод onCreateDialog (), как рекомендовано в рамках .

Таким образом, ваш диалог станет частью вашей деятельности и будет выполнятьсясам по себе.

Если вы действительно не хотите использовать это (я не вижу никакой причины, почему это так, но все же), вы можете использовать setOwnerActivity () в диалоге, чтобы назначить егок вашей деятельности.

...