#android #popupwindow #dismiss #tabactivity
#Android #всплывающее окно #отклонить #tabactivity
Вопрос:
У меня есть MapActivity как одна из четырех вкладок в TabActivity. Эта MapActivity может запускать всплывающее окно, являющееся легендой. Всплывающее окно остается на экране, поверх карты, до тех пор, пока снова не будет нажата кнопка «Показать легенду» (назад и вперед и т.д.).
Проблема в том, что, когда пользователь переключается на другую вкладку, всплывающее окно остается постоянным в представлении.
Я попытался реализовать метод 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;
}
}
};
Надеюсь, это дает представление о том, где я нахожусь. На вкладке «Карта» все работает отлично. Только когда у вас отображается легенда и вы переключаете вкладки, она по-прежнему отображается в других представлениях.
Ответ №1:
Я знаю, вы сказали, что реализация onPause() у вас не сработала, но я попробовал, и реализация onResume() и onPause() в MapActivity работает для меня.
Мне нужно было выполнить View.post(new Runnable() { … }) в onResume() поскольку я не смог воссоздать всплывающее окно во время onResume(), поэтому мне пришлось запланировать его выполнение сразу после этого:
package com.esri.android.tabdemo;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.widget.Toast;
public class MapActivity extends Activity
{
private TextView textView = null;
private PopupWindow popupWindow = null;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
textView = new TextView(this);
textView.setText("Hello World from MapActivity");
setContentView(textView);
}
@Override
protected void onPause()
{
super.onPause();
if (popupWindow != null)
{
popupWindow.dismiss();
popupWindow = null;
}
}
@Override
protected void onResume()
{
super.onResume();
final Context context = this;
textView.post(
new Runnable()
{
public void run()
{
popupWindow = new PopupWindow(context);
LinearLayout linearLayout = new LinearLayout(context);
linearLayout.setOrientation(LinearLayout.VERTICAL);
Button button = new Button(context);
button.setText("Hello");
button.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
Toast.makeText(context, "Hello", Toast.LENGTH_SHORT).show();
}
});
linearLayout.addView(button);
popupWindow.setContentView(linearLayout);
popupWindow.showAtLocation(linearLayout, Gravity.LEFT | Gravity.BOTTOM, 10, 10);
popupWindow.update(256, 64);
}
}
);
}
}
Ответ №2:
Вы можете инициализировать свое всплывающее окно следующим образом:
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);
Ответ №3:
Вы должны управлять своими диалогами с помощью метода onCreateDialog(), как это рекомендуется платформой.
Таким образом, ваше диалоговое окно станет частью вашей активности и будет делать это само по себе.
Если вы действительно не хотите это использовать (я не вижу никаких причин, почему это было бы так, но все же), вы можете использовать setOwnerActivity() в своем диалоговом окне, чтобы назначить его своей активности.
Комментарии:
1. Ах, спасибо за эту ссылку. Однако в моем приложении после отображения легенды основное окно не теряет фокус. Как вы думаете, я должен переключить свой код всплывающего окна (используя LayoutInflator) на AlertDialog? Или это украдет фокус? Цель легенды — наложить ее на карту, чтобы пользователь по-прежнему мог перемещаться по карте, но мог видеть символы и то, что они означают.