我创建了一个滚动视图,其中间的EditText是multiLine(Scrollable)。编辑该视图并添加超出允许高度的行时,它会按预期滚动。但是,整个容器的父滚动视图也会滚动,就好像它跟在文本后面一样。
<ScrollView
p1:minWidth="25px"
p1:minHeight="25px"
p1:layout_width="match_parent"
p1:layout_height="match_parent"
p1:background="#F7F3DE"
p1:id="@+id/scrollview">
<RelativeLayout
p1:layout_width="match_parent"
p1:layout_height="match_parent"
p1:clickable="true"
p1:focusableInTouchMode="true"
p1:id="@+id/realtiveLayout">
<EditText
p1:id="@+id/editText"
p1:focusableInTouchMode="true"
p1:layout_width="match_parent"
p1:layout_height="150dp"
p1:hint="Comments"
p1:background="#00000000"
p1:textSize="16sp"
p1:textColor="#555555"
p1:gravity="top"
p1:minLines="5"
p1:maxLines="5"
p1:inputType="textCapSentences|textMultiLine"
p1:scrollHorizontally="false"
p1:layout_marginTop="5dp"
p1:textColorHint="#A9A9A9" />
</RelativeLayout>
</ScrollView>
是否有人见过或知道此问题的解决方案?
(注意:这不是如何通过触摸滚动一个而不是另一个的问题,因为我已经理解了。这是一个主要的scrollview在EditText内部输入时移动的问题,即使文本没有降低但转而滚动。
答案 0 :(得分:1)
这里有一个答案: https://stackoverflow.com/a/28180281/3956566
使用此Managing Touch Events in a ViewGroup
每个子触摸都需要提供一个拦截,将父触摸事件返回为false。在使用子元素时禁用父触摸事件。您可以通过在java中创建onInterceptTouchEvent(MotionEvent ev)
来完成此操作。
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
/*
* This method JUST determines whether we want to intercept the motion.
* If we return true, onTouchEvent will be called and we do the actual
* scrolling there.
*/
// ...
// In general, we don't want to intercept touch events. They should be
// handled by the child view.
return false;
}
修改强>
提供了这个答案应该有所帮助:
https://stackoverflow.com/a/5090420/3956566 触摸文本字段时禁用滚动视图的位置。
// Get the ScrollView
final ScrollView myScroll = (ScrollView) findViewById(R.id.display_scrollview);
// Disable Scrolling by setting up an OnTouchListener to do nothing
myScroll.setOnTouchListener( new OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event) {
return true;
}
});
// Enable Scrolling by removing the OnTouchListner
tvDisplayScroll.setOnTouchListener(null);