У меня была та же проблема с QuickAction, я получал сбои от пользователей, хотя я не мог воспроизвести их на своих устройствах, поэтому, если кому-то все еще нужно решение, я был бы рад поделиться им
идея состоит в том, чтобыИзбегайте использования PopupViewContainer в PopupWindow, потому что ошибка сбоя находится в его методе dispatchKeyEvent (событие KeyEvent).Единственный способ сделать это - сохранить backgroundDrawable == null.Тогда вам придется обрабатывать внешние прикосновения и кнопку Назад самостоятельно.
PopupWindows Class:
public PopupWindows(Context context) {
mContext = context;
mWindow = new PopupWindow(context);
mWindow.setBackgroundDrawable(null);
......
}
protected void onShow() {
if (mRootView == null) {
return;
}
if (mRootView instanceof CustomRelativeLayout) {
((CustomRelativeLayout)mRootView).setDispatchKeyEventListener(new CustomRelativeLayout.OnDispatchKeyEventListener() {
@Override
public void onDispatchKeyEvent(KeyEvent event) {
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0 && mWindow.isShowing()) {
dismiss();
}
}
});
}
mRootView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN && mWindow.isShowing()) {
dismiss();
return true;
}
return false;
}
});
}
Не устанавливайте здесь какие-либо элементы рисования:
protected void preShow() {
if (mRootView == null)
throw new IllegalStateException("setContentView was not called with a view to display.");
onShow();
mWindow.setWidth(WindowManager.LayoutParams.WRAP_CONTENT);
mWindow.setHeight(WindowManager.LayoutParams.WRAP_CONTENT);
mWindow.setTouchable(true);
mWindow.setFocusable(true);
mWindow.setOutsideTouchable(true);
mWindow.setContentView(mRootView);
}
И все следующее классическое
CustomRelativeLayout:
public class CustomRelativeLayout extends RelativeLayout {
public CustomRelativeLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public CustomRelativeLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomRelativeLayout(Context context) {
super(context);
}
private OnDispatchKeyEventListener mOnDispatchKeyEventListener;
public void setDispatchKeyEventListener(OnDispatchKeyEventListener listener) {
mOnDispatchKeyEventListener = listener;
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (mOnDispatchKeyEventListener != null) {
mOnDispatchKeyEventListener.onDispatchKeyEvent(event);
}
return super.dispatchKeyEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
}
public static interface OnDispatchKeyEventListener {
public void onDispatchKeyEvent(KeyEvent event);
}
}
popup_vertical.xml и popup_horizont.xml:
просто используйте com.your.package.CustomRelativeLayout вместо верхнего уровня RelativeLayout
Надеюсь, это поможет