Для таких случаев пригодиться метод onInterceptTouchEvent(MotionEvent) класса viewgroup.
Создадим класс-наследник вьюгрупп
public class InterceptableConstraintLayout extends ConstraintLayout {
private Set<View> mIntercepatbleViews = new HashSet<>();
public InterceptableConstraintLayout(Context context) {
super(context);
}
public InterceptableConstraintLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public InterceptableConstraintLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public void addViewToIntercept(View v) {
if (v == null) return;
mIntercepatbleViews.add(v);
}
public void removeViewFromInterception(View v) {
if (v == null) return;
mIntercepatbleViews.remove(v);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN
&& mIntercepatbleViews.size() > 0
&& getChildCount() > 0) {
int x = (int) ev.getX();
int y = (int) ev.getY();
Rect hitRect = new Rect();
for (int i = 0; i < getChildCount(); i++) {
View child = getChildAt(i);
child.getHitRect(hitRect);
if (hitRect.contains(x, y) && mIntercepatbleViews.contains(child)) return true;
}
return super.onInterceptTouchEvent(ev);
} else return super.onInterceptTouchEvent(ev);
}
}
в activity берем нужные вью и передаем их в метод addViewToIntercept(View)
InterceptableConstraintLayout mLo = findViewById(R.id.fragment_phone_registration_profile_box);
View mEt = findViewById(R.id.fragment_fio_input_surname_info);
mLo.addViewToIntercept(mEt);
mLo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("mLo", "clicked");
}
});
В результате клики на нужные вьюхи перехватываются.
Добиться чего-то похожего через xml - я хз как. android:descendantFocusability="beforeDescendants" и clickable = true тоже не помогут.