android中ScrollView的setOnClickListener无效
近来意欲开发一款立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>
图形如下:
很显然,在没有内容的时候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
前面的事件的触发可能会阻止后续事件的触发,具体的可以看这篇博客:http://blog.csdn.net/msl0903/article/details/24205973