Androidの解决ViewFlipper与ScrollView滑动响应事件拦截的问题
1.
使用ViewFlipper作为水平滑动容器;需要使用ScrollView作为垂直滑动容器。
Android ViewFlipper添加ScrollView后不能滑动了原因是因为activity没有处理滑动效果。
网上都说是 重写
public boolean dispatchTouchEvent(MotionEvent ev) {
// TODO Auto-generated method stub
super.dispatchTouchEvent(ev);
return gestureDetector.onTouchEvent(ev);
}
其实该方法要在 scrollview中实现,具体看下面。。不是写在Activity中
这里是主newslist_contentactivity_viewflipper.xml内容了
<pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#EDE4D6"
android:orientation="vertical" >
<ViewFlipper
android:id="@+id/viewflipper"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:clickable="true"
android:layout_below="@id/linearLayout1">
</ViewFlipper>
</RelativeLayout>
但是我又添加了另一个xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#EDE4D6"
android:orientation="vertical" >
<com.blueberry.xinli.widget.FriendlyScrollView
android:id="@+id/yilincontent_scroll"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="none" >
<RelativeLayout
android:id="@+id/layout_title_textview"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="13dip"
android:layout_marginTop="20dip"
android:orientation="vertical" >
<TextView
android:id="@+id/ntitle_textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dip"
android:text="@string/yilin_top_left_text"
android:textColor="#ffdc6a86"
android:textSize="25sp" />
<!-- android:layout_centerHorizontal="true" -->
<TextView
android:id="@+id/nfrom_textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/ntitle_textview"
android:layout_marginTop="8dip"
android:text="@string/yilin_top_left_text"
android:textColor="@color/main_news_item_title"
android:textSize="18sp" />
</RelativeLayout>
</com.blueberry.xinli.widget.FriendlyScrollView>
</RelativeLayout>
这里我自定义的一个 scrollview 了。。。
需要实现一个自定义的scrollview类了
public class FriendlyScrollView extends ScrollView {
GestureDetector gestureDetector;
public FriendlyScrollView(Context context) {
super(context);
gestureDetector = gestureDetector;
}
public FriendlyScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public FriendlyScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public void setGestureDetector(GestureDetector gestureDetector) {
this.gestureDetector = gestureDetector;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
return gestureDetector.onTouchEvent(event);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev){
gestureDetector.onTouchEvent(ev);
super.dispatchTouchEvent(ev);
return true;
}
}
由于ViewFlipper在外,ScrollView在内,因此一般的做法是定义一个手势响应类来处理响应事件,并将响应事件的处理交给内层的ScrollView。
yilincontent_scroll = (FriendlyScrollView)v.findViewById(R.id.yilincontent_scroll);
yilincontent_scroll.setOnTouchListener(new listener());
yilincontent_scroll.setGestureDetector(gestureDetector);
记得在这里添加yilincontent_scroll.setGestureDetector(gestureDetector); 否则会有空指针异常的。。
一下就是如何在Activity中实现手势左右滑动了,要去实现了,这里不做具体内容了。
解决问题关键地点:
自定义一个scrollview,, 重写那个dispatchTouchEvent 方法即可。。
2 .源码下载
下载地址