Dimiss всплывающее окно при касании снаружи
Я хотел уволить PopupWindow
когда коснулся снаружи, я получил этот ответ от этого ТАКОГО вопроса.
Здесь они попросили включить эти две строки кода.
myPopupWindow.setBackgroundDrawable(new BitmapDrawable());
myPopupWindow.setOutsideTouchable(true);
Теперь всплывающее окно разочаровывается, когда я касаюсь за пределами PopupWindow
,
setOutsideTouchable(true);
один не работает. когда я устанавливаю фон Drawable, он работает. Как происходит это волшебство? Кто-нибудь может объяснить это?
Также new BitmapDrawable()
устарела. есть ли альтернатива для этого?
3 ответа
Используйте TouchInterceptor, чтобы закрыть всплывающее окно:-
private LayoutInflater inflater;
private PopupWindow pw;
private View popupView;
inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
popupView = inflater.inflate(R.layout.popup_layout, null, true);
pw = new PopupWindow(popupView,750,500,true);
pw.setBackgroundDrawable(new BitmapDrawable());
pw.setTouchInterceptor(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
pw.dismiss();
return true;
}
return false;
}
});
pw.showAtLocation(findViewById(R.id.main_layout),Gravity.BOTTOM, 3, 35);
Попробуйте код ниже:
myPopupWindow.setCanceledOnTouchOutside(true);
myPopupWindow.setCancelable(true);
Сделайте ваше всплывающее окно в полноэкранном режиме прозрачным "корневым" кликабельным макетом, а затем добавьте всплывающее окно с размерамиpopup.setWidth(850); popup.setHeight(550)
). Также сделайте прозрачный макет root кликабельным, чтобы вы знали, что пользователь касается "снаружи", потому что для пользователя будет видно только всплывающее окно. Это корневой макет:
final LinearLayout contentLayout = new LinearLayout(activity);
contentLayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
contentLayout.setOrientation(LinearLayout.VERTICAL);
contentLayout.setClickable(true);
contentLayout.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
dismissPopup();
}
});
теперь вам нужно только добавить всплывающее окно в этот макет. Почему так лучше? Потому что вы можете установить цвет фона contentLayout, чтобы добиться эффекта затенения всплывающего окна на весь экран, чтобы пользователю было видно, что только всплывающее окно является модальным и активным прямо сейчас.