近来意欲开发一款立Flag的APP,有一个部分类似便签,需要一个EditText,而这个EditText外边又套了一个ScrollView(不用ScrollView的话,内容如果超出屏幕,也可以滑动,不过我需要插入图片,如果不用ScrollView的话体验不好,这里不详细赘述),布局如下:

<ScrollView
android:id="@+id/sv_edit_view"
android:layout_below="@id/et_edit_title"
android:layout_above="@id/view_edit_1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="18dp"
android:layout_marginRight="18dp">

<EditText
android:background="@null"
android:id="@+id/et_edit_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="top"
android:textSize="16sp"
android:textColor="#fff"
android:hint="请输入内容"/>
</ScrollView>

图形如下:

android中ScrollView的setOnClickListener无效_滑动


很显然,在没有内容的时候​​EditText​​​只有一行那么高,而​​ScrollView​​​是​​match-parent​​​的,而我自然希望点击​​ScrollView​​​的任何一个地方都能让​​EditText​​获得焦点,因此我写了如下代码:

scrollView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.d("YYPT", "click the scrollView");
content.setFocusable(true);
content.setFocusableInTouchMode(true);
content.requestFocus();
AddFlagActivity.this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
});

本以为这么简单的一件事,随手就写了,然而点了之后什么反应都没有,​​Logcat​​里面也没有输出。

经过查阅资料,将上述代码改成如下可解:

scrollView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
//通知父控件请勿拦截本控件touch事件
view.getParent().requestDisallowInterceptTouchEvent(true);
switch (motionEvent.getAction()){
case MotionEvent.ACTION_UP:
Log.d("YYPT", "click the scrollView");
//点击整个页面都会让内容框获得焦点,且弹出软键盘
content.setFocusable(true);
content.setFocusableInTouchMode(true);
content.requestFocus();
AddFlagActivity.this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
break;
}
return false;
}
});

原因嘛,ScrollView中的事件其实是有个先后顺序的,​​touch -> LongClick -> Click​​​
前面的事件的触发可能会阻止后续事件的触发