我正在尝试将ScrollView放在另一个ScrollView中,我尝试了在这个网站上找到的答案,但它似乎仍然无法正常工作。这是XML:
<ScrollView
android:id="@+id/scrollView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusableInTouchMode="false" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textViewDirectoryDetailName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Name"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="@color/red" />
<LinearLayout
android:id="@+id/linearLayoutDirectoryDetailContainImage"
android:layout_width="300dp"
android:layout_height="200dp"
android:layout_gravity="center_vertical|center_horizontal"
android:background="@drawable/general_image"
android:gravity="center"
android:orientation="vertical" >
</LinearLayout>
<ScrollView
android:id="@+id/scrollView2"
android:layout_width="match_parent"
android:layout_height="100dp"
android:focusableInTouchMode="false" >
<TextView
android:id="@+id/textViewDirectoryDescription"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:autoLink="phone"
android:text="098 123 45 678"
android:textAppearance="?android:attr/textAppearanceLarge" />
</ScrollView>
这是Java代码:
parentScrollView = (ScrollView) findViewById(R.id.scrollView1);
childScrollView = (ScrollView) findViewById(R.id.scrollView2);
parentScrollView.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View p_v, MotionEvent p_event) {
childScrollView.getParent().requestDisallowInterceptTouchEvent(
false);
// We will have to follow above for all scrollable contents
return false;
}
});
childScrollView.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View p_v, MotionEvent p_event) {
// this will disallow the touch request for parent scroll on
// touch of child view
p_v.getParent().requestDisallowInterceptTouchEvent(true);
return false;
}
});
// We will have to follow above for all child scrollable contents
似乎发生了这样的事情:当我在TextView中有文本时,它似乎根本不让我滚动它。它只是滚动父级。但是,当我没有文本并且我触摸子ScrollView时它不会滚动父级,所以我猜它正在工作。但是,如果我有文字,你有什么想法吗?
答案 0 :(得分:37)
您应该使用NestedScrollView。
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<!-- -->
</android.support.v4.widget.NestedScrollView>
答案 1 :(得分:5)
老问题,但是, 我发布了对我有用的内容,我理解了Coz我也经历过的问题,我刚刚删除了XML中的ScrollView for TextView,而是在java代码中实现了TextView的滚动功能。从而, XML将是:
<TextView
android:id="@+id/textViewDirectoryDetailName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Name"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="@color/red" />
<LinearLayout
android:id="@+id/linearLayoutDirectoryDetailContainImage"
android:layout_width="300dp"
android:layout_height="200dp"
android:layout_gravity="center_vertical|center_horizontal"
android:background="@drawable/general_image"
android:gravity="center"
android:orientation="vertical" >
</LinearLayout>
<TextView
android:id="@+id/textViewDirectoryDescription"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:autoLink="phone"
android:text="098 123 45 678"
android:textAppearance="?android:attr/textAppearanceLarge" />
并且Java代码将是
TextView extViewDD =
(TextView)findViewById(R.id.textViewDirectoryDescription);
//for Scrolling of textView
textViewDD.setMovementMethod(new ScrollingMovementMethod());
//to stop parent linearlayout scrollview when touched on textview
textViewDD.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
v.getParent().requestDisallowInterceptTouchEvent(true);
return false;
}
});
答案 2 :(得分:3)
在另一个滚动视图中使用滚动视图不是一个好习惯。但是,您使用的代码在某些情况下可能会起作用。但是当你有多个元素时它可能会失败。在这种情况下,它可能无法识别手势。
但是,如果有帮助ScrollView Inside ScrollView,您可以尝试这个答案。当识别出对孩子的触摸时,它禁用父ScrollView的触摸。如果有帮助的话,还可以查看此post。
答案 3 :(得分:2)
我使用RectF来测试你的手指是否位于child_view的范围内。
我已将它用于scrollview和viewpager之间混合的情况(包含带有recycleviews的两个页面)。
尝试这些代码,你会得到你想要的。
findViewById(R.id.parent_view).setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
View childV = findViewById(R.id.child_view);
if (childV != null) {
int[] l = new int[2];
childV.getLocationOnScreen(l);
RectF rect = new RectF(l[0], l[1], l[0] + childV.getWidth(), l[1] + childV.getHeight());
if(rect.contains( event.getX(), event.getY())) {
childV.getParent()
.requestDisallowInterceptTouchEvent(false);
childV.onTouchEvent(event);
return true;
}
}
childV.getParent()
.requestDisallowInterceptTouchEvent(true);
return false;
}
});
答案 4 :(得分:1)
你不能在Scrollview OS中使用两个Scrollview让人混淆哪一个必须滚动所以你的活动挂起所以不要像这样使用
答案 5 :(得分:0)
检查this链接,该链接显示如何在同一活动中使用具有滚动功能的两个小部件。检查下面的代码。
parentScroll.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
Log.v("PARENT", "PARENT TOUCH");
findViewById(R.id.child_scroll).getParent()
.requestDisallowInterceptTouchEvent(false);
return false;
}
});
childScroll.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
Log.v("CHILD", "CHILD TOUCH");
// Disallow the touch request for parent scroll on touch of
// child view
v.getParent().requestDisallowInterceptTouchEvent(true);
return false;
}
});
答案 6 :(得分:0)
我几乎可以肯定这是不可能的:
android如何处理触摸事件:
父获取事件并决定是否必须处理它或是否应该让它处理给孩子;
因此,如果滚动视图处理触摸,处理它的那个,总是父视频
http://developer.android.com/training/gestures/viewgroup.html
我个人不知道是否有办法了解父滚动视图背后的内容,看看它是否是另一个滚动视图并让它处理动作
答案 7 :(得分:0)
这是一个可能的解决方案,可以在ScrollView中使用ScrollView和ListView。 ScrollView Inside ScrollView
答案 8 :(得分:0)
将此自定义滚动视图用作内部滚动视图:
public class TouchMeScrollView extends ScrollView {
public TouchMeScrollView(Context context) {
super(context);
}
public TouchMeScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public TouchMeScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public TouchMeScrollView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
requestDisallowInterceptTouchEvent(true);
return super.onTouchEvent(ev);
}
}