Поскольку мне не нравилась идея ждать передачи макета только для того, чтобы получить новый размер прямоугольника TouchDelegate, я выбрал другое решение:
public class TouchSizeIncreaser extends FrameLayout {
public TouchSizeIncreaser(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
return true;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
final View child = getChildAt(0);
if(child != null) {
child.onTouchEvent(event);
}
return true;
}
}
А затем в макете:
<ch.tutti.ui.util.TouchSizeIncreaser
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp">
<Spinner
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"/>
</ch.tutti.ui.util.TouchSizeIncreaser>
Идея состоит в том, что TouchSizeIncreaser FrameLayout будет обертывать Spinner (может быть любым дочерним представлением) и пересылать все события касания, захваченные в его прямоугольнике, дочернему представлению. Он работает для щелчков, счетчик открывается, даже если щелкнуть за его пределами, не уверен, каковы последствия для других более сложных случаев.