Оскільки мені не сподобалася ідея чекати пропуску макета лише для того, щоб отримати новий розмір прямокутника 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 (може бути будь-яким дочірнім видом) і перенаправить всі події дотику, зафіксовані в його прямому зверненні, до дочірнього View. Він працює для клацань, блешня відкривається, навіть якщо клацнути поза її межами, не впевнений, які наслідки мають інші складніші випадки.