46

我有一个ScrollView内部,EditText它被设置为垂直滚动。但它不滚动。相反,整个布局滚动,每当我尝试滚动EditText. 下面是代码 -

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<LinearLayout 
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >

<TextView
    android:id="@+id/b1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="39dp"
    android:text="Title"
    android:textColor="#3bb9ff"
    android:textSize="15sp" />

<EditText
    android:id="@+id/Text1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:ems="10"
    android:hint="Title"
    android:singleLine="true" >

    <requestFocus />

</EditText>

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Content"
    android:layout_marginTop="50dp"
    android:textColor="#3bb9ff"
    android:textSize="15sp"
   />


<EditText
    android:id="@+id/newTodoText"
    android:layout_width="fill_parent"
    android:layout_height="match_parent" 
    android:minLines="2"
    android:maxLines="7"
     android:hint="Write something"
     android:scrollbars = "vertical" >
</EditText>
<Button
    android:id="@+id/Add"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:text="Add" />


</LinearLayout>
</ScrollView>

id 为“newTodoText”的 EditText 在这里有问题。

4

12 回答 12

105
EditText EtOne = (EditText) findViewById(R.id.EditText01);
EtOne.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (v.getId() == R.id.EditText01) {
            v.getParent().requestDisallowInterceptTouchEvent(true);
            switch (event.getAction() & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_UP:
                v.getParent().requestDisallowInterceptTouchEvent(false);
                break;
            }
        }
        return false;
    }
});
于 2013-12-11T13:42:18.657 回答
37

You have to just replace your <ScrollView ></ScrollView> with this Custom ScrollView like <com.example.VerticalScrollview > </com.example.VerticalScrollview >

package com.example;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.ScrollView;

public class VerticalScrollview extends ScrollView{

    public VerticalScrollview(Context context) {
        super(context);
    }

     public VerticalScrollview(Context context, AttributeSet attrs) {
            super(context, attrs);
        }

        public VerticalScrollview(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        final int action = ev.getAction();
        switch (action)
        {
            case MotionEvent.ACTION_DOWN:
                    Log.i("VerticalScrollview", "onInterceptTouchEvent: DOWN super false" );
                    super.onTouchEvent(ev);
                    break;

            case MotionEvent.ACTION_MOVE:
                    return false; // redirect MotionEvents to ourself

            case MotionEvent.ACTION_CANCEL:
                    Log.i("VerticalScrollview", "onInterceptTouchEvent: CANCEL super false" );
                    super.onTouchEvent(ev);
                    break;

            case MotionEvent.ACTION_UP:
                    Log.i("VerticalScrollview", "onInterceptTouchEvent: UP super false" );
                    return false;

            default: Log.i("VerticalScrollview", "onInterceptTouchEvent: " + action ); break;
        }

        return false;
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        super.onTouchEvent(ev);
        Log.i("VerticalScrollview", "onTouchEvent. action: " + ev.getAction() );
         return true;
    }
}
于 2013-05-17T09:37:23.863 回答
18
mEdtText1.setOnTouchListener(new View.OnTouchListener() { 
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                mScrlMain.requestDisallowInterceptTouchEvent(true);
                return false;
            }
        });

// 使用您的编辑文本对象更改听到 mEdtText1 并使用您的滚动视图对象更改 mScrlMain,它们确实有效。

于 2015-08-05T09:37:07.190 回答
7

你应该使用 NestedScrollView 类。此类支持父滚动中的子滚动。这个类可以是孩子或父母。

<android.support.v4.widget.NestedScrollView         
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#d6d8d9">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:maxLines="512"
                android:text=" your content"/>
        <android.support.v4.widget.NestedScrollView
            android:layout_below="@id/ll_button"
            android:layout_width="match_parent"
            android:layout_height="300dp"
            android:background="#d6d8d9">

            <EditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content" 
                android:text="your content"
                android:maxLines="512"/>    
        </android.support.v4.widget.NestedScrollView>       
    </LinearLayout>

</android.support.v4.widget.NestedScrollView> 
于 2016-12-14T04:19:25.010 回答
6
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" >

这将使您的整个布局可滚动。

设置您的edittext可滚动添加android:scrollbars="vertical" 到您的edittext

在你的代码中它已经写好了

<EditText
    android:id="@+id/newTodoText"
    android:layout_width="fill_parent"
    android:layout_height="match_parent" 
    android:minLines="2"
    android:maxLines="7"
     android:hint="Write something"
     android:scrollbars = "vertical" >

从代码中删除。它将正常工作

于 2013-05-17T09:40:06.063 回答
2

使用此代码它的工作

以 XML 格式

android:singleLine="false"
android:overScrollMode="always"
android:scrollbarStyle="insideInset"
android:scrollbars="vertical"

在编程

et_feedback.setOnTouchListener(new View.OnTouchListener() {

            public boolean onTouch(View view, MotionEvent event) {

                if (view.getId() == R.id.et_feedback) {
                    view.getParent().requestDisallowInterceptTouchEvent(true);
                    switch (event.getAction() & MotionEvent.ACTION_MASK) {
                        case MotionEvent.ACTION_UP:
                            view.getParent().requestDisallowInterceptTouchEvent(false);
                            break;
                    }
                }
                return false;
            }
        });
于 2017-10-30T06:47:26.010 回答
1
noteEdit.setMovementMethod(new ScrollingMovementMethod());
    ScrollingMovementMethod.getInstance();


    noteEdit.setOnTouchListener(new View.OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {

            noteEdit.getParent().requestDisallowInterceptTouchEvent(true);

            return false;
        }


    });
于 2016-02-01T07:28:17.690 回答
1

下面提到了一种简单的方法,并附有一些描述

            myEditText.setOnTouchListener(new View.OnTouchListener() {  //Register a callback to be invoked when a touch event is sent to this view.
            @Override
            public boolean onTouch(View v, MotionEvent event) {     
//Called when a touch event is dispatched to a view. This allows listeners to get a chance to respond before the target view.
                mScrollView.requestDisallowInterceptTouchEvent(true);
                return false;
            }
        });
于 2017-02-09T12:13:46.750 回答
0
  • 您已将大多数布局设置ScrollView为您的父级。这就是你的整个布局被滚动的原因。
  • 就您的 EditText 而言,您已经使用 android:scrollbars = "vertical"了这意味着如果 EditText 增长,将出现一个垂直的 srollBar。只有当 edittext 的数据足够高时,您才会获得滚动条和滚动效果。

希望这可以帮助...

于 2013-05-17T09:23:07.530 回答
0

我在滑动关闭的底部工作表中遇到了类似的问题,但我怀疑这通常会起作用:

@SuppressLint("ClickableViewAccessibility")
fun View.blockAllAncestorsInterceptingTouch() {
    setOnTouchListener { _, _ ->
        parent?.requestDisallowInterceptTouchEvent(true)
        false
    }
}

抑制 Lint 是合法的,如果总是返回 false,则无需调用 performClick。

于 2020-12-02T15:11:50.227 回答
0

XML 代码

    android:gravity="top"
    android:inputType="text|textMultiLine"
    android:lines="5"

对 Kotlin 使用以下代码

    editText.setOnTouchListener { v, event ->
        if (v.id == R.id.editText) {
            v.parent.requestDisallowInterceptTouchEvent(true)
            when (event.action and MotionEvent.ACTION_MASK) {
                MotionEvent.ACTION_UP -> v.parent.requestDisallowInterceptTouchEvent(false)
            }
        }
        false
    }
于 2020-08-23T10:26:32.887 回答
-2

您已将“滚动视图”设置为您的父级 - 这意味着它会滚动整个布局。

如果要滚动特定的“编辑文本”,则必须将另一个滚动视图放置到该编辑文本。

于 2013-05-18T04:13:47.083 回答