Я создал пользовательскую ViewGroup для отображения информационного окна, привязанного к другому представлению (всплывающее окно).Дочернее представление - это актуальное информационное окно, BalloonView - полноэкранное отображение для абсолютного позиционирования дочернего элемента и перехвата касания.
public BalloonView(View anchor, View child) {
super(anchor.getContext());
//calculate popup position relative to anchor and do stuff
init(...);
//receive child via constructor, or inflate/create default one
this.child = child;
//this.child = inflate(...);
//this.child = new SomeView(anchor.getContext());
addView(child);
//this way I don't need to create intermediate ViewGroup to hold my View
//but it is fullscreen (good for dialogs and absolute positioning)
//if you need relative positioning, see @iturki answer above
((ViewGroup) anchor.getRootView()).addView(this);
}
private void dismiss() {
((ViewGroup) getParent()).removeView(this);
}
Обрабатывать щелчки внутри дочернего элемента:
child.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//write your code here to handle clicks inside
}
});
Чтобы закрыть мой просмотр, щелкнув его снаружиБЕЗ делегирования касания нижележащему представлению:
BalloonView.this.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
Чтобы закрыть мой вид, щелкнув снаружи, НЕ делегировав касание нижележащему представлению:
@Override
public boolean onTouchEvent(MotionEvent event) {
dismiss();
return false; //allows underlying View to handle touch
}
Чтобы отклонить нажатие кнопки «Назад»:
//do this in constructor to be able to intercept key
setFocusableInTouchMode(true);
requestFocus();
@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
dismiss();
return true;
}
return super.onKeyPreIme(keyCode, event);
}