Android 如何在滚动视图内滚动编辑文本

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/24428808/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 08:07:14  来源:igfitidea点击:

How to scroll the edittext inside the scrollview

androiduser-interfacescrollview

提问by Maveňツ

I have a scrollview inside which there is a editext which is multiline. I want to scroll the edittext to see the lower content but it can't be done.

我有一个滚动视图,里面有一个多行的 editext 。我想滚动编辑文本以查看较低的内容,但无法完成。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:background="@android:color/holo_blue_light"
        android:gravity="center" >
        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="View Complaint"
            android:textAppearance="?android:attr/textAppearanceLarge" />
    </LinearLayout>
    <ScrollView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:orientation="vertical"
            android:padding="20dp" >
            <TextView
                android:id="@+id/textView2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="15dp"
                android:text="Order Number 0100C1"
                android:textAppearance="?android:attr/textAppearanceMedium" />
            <TextView
                android:id="@+id/textView3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:text="Name of ClientClient 1"
                android:textAppearance="?android:attr/textAppearanceMedium" />
            <TextView
                android:id="@+id/textView4"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:text="Subject : Measurement Issues"
                android:textAppearance="?android:attr/textAppearanceMedium" />
            <TextView
                android:id="@+id/textView5"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="25dp"
                android:text="Description"
                android:textAppearance="?android:attr/textAppearanceMedium" />
            <TextView
                android:id="@+id/textView6"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="15dp"
                android:text="Lorem ipsum dolor sit amet, sapien etiam, nunc amet dolor ac odio mauris justo. Luctus arcu, urna praesent at id quisque ac. Arcu massa vestibulum malesuada, integer vivamus el/ eu "
                android:textAppearance="?android:attr/textAppearanceMedium" />
            <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal" >
                <TextView
                    android:id="@+id/textView7"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="2dp"
                    android:text="Assign to"
                    android:textAppearance="?android:attr/textAppearanceMedium" />
                <Spinner
                    android:id="@+id/spinner1"
                    android:layout_width="match_parent"
                    android:layout_height="40dp"
                    android:entries="@array/array_name" />
            </LinearLayout>
            <EditText
                android:id="@+id/editText1"
                android:layout_width="match_parent"
                android:layout_height="200dp"
                android:layout_marginTop="15dp"
                android:background="#eeeeee"
                android:inputType="textMultiLine"
                android:singleLine="false"
                android:text="Android applications normally run entirely on a single thread by              default the “UI thread” or the “main thread”.

            android:textAppearance="?android:attr/textAppearanceMedium" ></EditText>
            <TextView
                android:id="@+id/textView5"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="20dp"
                android:text="Comment History"
                android:textAppearance="?android:attr/textAppearanceMedium" />
            <ImageView
                android:id="@+id/imageView1"
                android:layout_width="fill_parent"
                android:layout_height="147dp"
                android:src="@drawable/adddd" />
            <CheckBox
                android:id="@+id/checkBox1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                android:text="Close Complaints"
                android:textAppearance="?android:attr/textAppearanceLarge" />
            <Button
                android:id="@+id/login"
                style="?android:attr/buttonStyleSmall"
                android:layout_width="match_parent"
                android:layout_height="45dp"
                android:layout_below="@+id/ll"
                android:layout_marginLeft="20dp"
                android:layout_marginRight="20dp"
                android:layout_marginTop="15dp"
                android:background="@drawable/login_btn"
                android:text="Submit"
                android:textColor="@android:color/holo_blue_dark"
                android:textSize="25dp"
                android:textStyle="bold" />
        </LinearLayout>
    </ScrollView>
</LinearLayout>

enter image description here

在此处输入图片说明

Can you guys help me in that . I think editText is getting the focus when cursor is inside it.

你们能帮我吗。我认为当光标在其中时,editText 会获得焦点。

Thanks..!!!!!

谢谢..!!!!!

回答by Hariharan

Try this..

尝试这个..

Add below lines into your EditText

将以下几行添加到您的 EditText

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

Example

例子

   <EditText
        android:id="@+id/editText1"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:layout_marginTop="15dp"
        android:background="#eeeeee"
        android:inputType="textMultiLine"
        android:singleLine="false"
        android:overScrollMode="always"
        android:scrollbarStyle="insideInset"
        android:scrollbars="vertical"
        android:text="Android applications normally run entirely on a single thread by              default the “UI thread” or the “main thread”.
        android:textAppearance="?android:attr/textAppearanceMedium" >
    </EditText>

EDIT

编辑

Programmatically

以编程方式

youredittext.setOnTouchListener(new OnTouchListener() {

      public boolean onTouch(View v, MotionEvent event) {
            if (youredittext.hasFocus()) {
               v.getParent().requestDisallowInterceptTouchEvent(true);
               switch (event.getAction() & MotionEvent.ACTION_MASK){
               case MotionEvent.ACTION_SCROLL:
                      v.getParent().requestDisallowInterceptTouchEvent(false);
                      return true;
                }
             }
             return false;
       }
});

回答by Ayman Mahgoub

First add this at XML

首先在 XML 添加这个

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

Then add the same above "OnTouch" but make it return "false" not "true"

然后在“OnTouch”上方添加相同的内容,但使其返回“false”而不是“true”

public boolean onTouch(View view, MotionEvent event) {

                    if (view.getId() == R.id.DwEdit) {
                        view.getParent().requestDisallowInterceptTouchEvent(true);
                        switch (event.getAction()&MotionEvent.ACTION_MASK){
                        case MotionEvent.ACTION_UP:
                            view.getParent().requestDisallowInterceptTouchEvent(false);
                            break;
                        }
                    }
                    return false;
}

回答by HungNM2

you should use NestedScrollView class. This class support child scrolling inside parent scrolling. This class can be a child or a parent.

你应该使用 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>           

回答by Keshav Gera

Use this code it's working

使用此代码它正在工作

In XML

在 XML 中

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

In programming

在编程中

edittext.setOnTouchListener(new View.OnTouchListener() {

    public boolean onTouch(View view, MotionEvent event) {

        if (view.getId() == R.id.edittext) {
            view.getParent().requestDisallowInterceptTouchEvent(true);
            switch (event.getAction() & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_UP:
                view.getParent().requestDisallowInterceptTouchEvent(false);
                break;
            }
        }
        return false;
    }
});

回答by vovahost

Kotlin version

科特林版

Add the following lines to the EditText in your xml:

将以下行添加到 xml 中的 EditText:

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

Add this to the Activity/Fragment:

将此添加到活动/片段:

myEditText.setOnTouchListener { view, event ->
   view.parent.requestDisallowInterceptTouchEvent(true)
   if ((event.action and MotionEvent.ACTION_MASK) == MotionEvent.ACTION_UP) {
       view.parent.requestDisallowInterceptTouchEvent(false)
   }
   return@setOnTouchListener false
}

回答by Adam

Building upon the answer by @Ayman Mahgoub and @Hariharan. The solution worked great except while scrolling the edit text there is no scroll momentum. As soon as the finger lifts up, the scrolling immediately stops.

基于@Ayman Mahgoub 和@Hariharan 的回答。该解决方案效果很好,除了在滚动编辑文本时没有滚动动力。手指一抬起,滚动立即停止。

To gain scroll momentum wrap a scrollview around the EditText and let the EditText's height wrap content (set minHeight if you'd like). Remove the following lines from the edit text:

为了获得滚动动力,在 EditText 周围包裹一个滚动视图,让 EditText 的高度包裹内容(如果你愿意,可以设置 minHeight)。从编辑文本中删除以下行:

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

Now the nested ScrollView wrapped around the EditText takes care of the scrolling. Update the onTouch handler to take into account the updated view hierarchy:

现在包裹在 EditText 周围的嵌套 ScrollView 负责滚动。更新 onTouch 处理程序以考虑更新的视图层次结构:

public boolean onTouch(View view, MotionEvent event) {
    v.getParent().getParent().requestDisallowInterceptTouchEvent(true);
    switch (event.getAction() & MotionEvent.ACTION_MASK){
        case MotionEvent.ACTION_UP:
            v.getParent().getParent().requestDisallowInterceptTouchEvent(false);
            break;
    }
    return false; 

Be warned, this solution is now tightly coupled to the view hierarchy.

请注意,此解决方案现在与视图层次结构紧密耦合。

Gist: https://gist.github.com/atoennis/7549fba2634d0abccddf

要点:https: //gist.github.com/atoennis/7549fba2634d0abccddf

回答by mas945846

I would vote up the updated answer provided by @Ayman Mahgoub, but I do not have a high enough reputation. His code works. I had to change return true to return false. You put the .setOnTouchListener() method in your java class and put the three lines:

我会投票支持@Ayman Mahgoub 提供的更新答案,但我的声誉不够高。他的代码有效。我不得不改变 return true 返回 false。您将 .setOnTouchListener() 方法放在您的 java 类中并放置三行:

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

in the corresponding xml file. You can see the implementation in the android emulator, and on the android phone you use for testing. Thank you so much @Ayman Mahgoub and @Hariharan!

在相应的 xml 文件中。您可以在 android 模拟器和用于测试的 android 手机上查看实现。非常感谢@Ayman Mahgoub 和@Hariharan!

回答by SWAPDROiD

Below Answer will help you to make Edit Text scrollable inside Scroll View and also show Count of it.

下面的答案将帮助您使编辑文本在滚动视图内可滚动并显示它的计数。

1.Make one rectangle_with_border_gray.xml file in @drawable folder.

1.在@drawable 文件夹中制作一个 rectangle_with_border_gray.xml 文件。

 <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">
        <corners android:radius="0dp"/>
        <solid android:color="#FFFFFF"/>
        <stroke android:color="#7f848686"
            android:width="0.01dp"/>
    </shape>

2.Then, In @layout write below code in scroll view.

2.然后,在@layout 中在滚动视图中编写下面的代码。

<ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="none">

             <RelativeLayout
                android:id="@+id/sv_profile_creation_layout"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="#FFFFFF">

                    <LinearLayout
                        android:id="@+id/LL_optional_message"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_below="@+id/tv_optional_message_title"
                        android:background="@drawable/rectangle_with_border_gray"
                        android:orientation="horizontal"
                        android:padding="@dimen/margin_02_dp">

                        <EditText
                            android:id="@+id/et_optional_message"
                            android:layout_width="match_parent"
                            android:layout_height="100dp"
                            android:background="@color/colorWhite"
                            android:gravity="start"
                            android:hint="@string/why_not_leave_a_message"
                            android:inputType="textMultiLine"
                            android:isScrollContainer="true"
                            android:maxLines="5"
                            android:overScrollMode="always"
                            android:padding="8dp"
                            android:scrollbarStyle="insideInset"
                            android:scrollbars="vertical"
                            android:textColor="@color/colorEditTextHintNormal"
                            android:textColorHint="@color/colorEditTextHint"
                            android:textSize="@dimen/margin_14_dp" />

                    </LinearLayout>

                    <TextView
                        android:id="@+id/tv_description_count"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_alignParentRight="true"
                        android:layout_below="@+id/LL_optional_message"
                        android:layout_centerVertical="true"
                        android:layout_marginBottom="@dimen/margin_16_dp"
                        android:ellipsize="end"
                        android:gravity="center"
                        android:maxLines="1"
                        android:text="0/200"
                        android:textColor="@color/colorLittleDarkGray"
                        android:textSize="@dimen/margin_12_dp"
                        android:textStyle="normal" />

         </RelativeLayout>
 </ScrollView>

3.Then, Inside your Activity or Fragment write below code:

3.然后,在您的 Activity 或 Fragment 中写入以下代码:

TextView tv_description_count = (TextView) view.findViewById(R.id.tv_description_count);

EditText et_optional_message = (EditText) findViewById(R.id.et_optional_message);

private void makeScrollable(){
            et_optional_message.addTextChangedListener(mTextEditorWatcher);
            et_optional_message.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View view, MotionEvent motionEvent) {
                    view.getParent().requestDisallowInterceptTouchEvent(true);
                    switch (motionEvent.getAction() & MotionEvent.ACTION_MASK) {
                        case MotionEvent.ACTION_SCROLL:
                            view.getParent().requestDisallowInterceptTouchEvent(false);
                            return true;
                        case MotionEvent.ACTION_BUTTON_PRESS:
                            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                            imm.showSoftInput(et_optional_message, InputMethodManager.SHOW_IMPLICIT);
                    }
                    return false;
                }
            });
        }

 private final TextWatcher mTextEditorWatcher = new TextWatcher() {
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            public void onTextChanged(CharSequence s, int start, int before, int count) {
                //This sets a textview to the current length
                tv_description_count.setText(String.valueOf(s.length()));
            }

            public void afterTextChanged(Editable s) {
            }
        };

Happy Coding......

快乐编码......

回答by Ayan

First create a custom Scrollview class as given below:

首先创建一个自定义 Scrollview 类,如下所示:

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

public class MyCustomScrollview extends ScrollView {

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

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

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

    @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;
    }
}
  1. Now in the activity or fragment where you are using the EditText, write the following code for the EditText object that you want to scroll inside the Scrollview :

    import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.widget.EditText;

    public class MainActivity extends AppCompatActivity {

    EditText et;
    VerticalScrollview sv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        init();
    }
    
    private void init() {
        sv = findViewById(R.id.sv);
        et = findViewById(R.id.et);
        et.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (v.getId() == R.id.sv) {
                    v.getParent().requestDisallowInterceptTouchEvent(true);
                    switch (event.getAction() & MotionEvent.ACTION_MASK) {
                        case MotionEvent.ACTION_UP:
                            v.getParent().requestDisallowInterceptTouchEvent(false);
                            break;
                    }
                }
                return false;
            }
        });
    }
    

    }

  1. 现在,在您使用 EditText 的活动或片段中,为要在 Scrollview 内滚动的 EditText 对象编写以下代码:

    导入 android.support.v7.app.AppCompatActivity; 导入 android.os.Bundle; 导入 android.view.MotionEvent; 导入 android.view.View; 导入 android.widget.EditText;

    公共类 MainActivity 扩展 AppCompatActivity {

    EditText et;
    VerticalScrollview sv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        init();
    }
    
    private void init() {
        sv = findViewById(R.id.sv);
        et = findViewById(R.id.et);
        et.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (v.getId() == R.id.sv) {
                    v.getParent().requestDisallowInterceptTouchEvent(true);
                    switch (event.getAction() & MotionEvent.ACTION_MASK) {
                        case MotionEvent.ACTION_UP:
                            v.getParent().requestDisallowInterceptTouchEvent(false);
                            break;
                    }
                }
                return false;
            }
        });
    }
    

    }

3.The follwing xml is given below:

3.下面的xml如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <com.example.ayan.scrollableedittext.VerticalScrollview
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/sv">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="600dp"
                android:gravity="center">
                <EditText
                    android:id="@+id/et"
                    android:layout_width="200dp"
                    android:layout_height="80dp"
                    android:nestedScrollingEnabled="true"
                    android:gravity="start" />
            </LinearLayout>
        </LinearLayout>
    </com.example.ayan.scrollableedittext.VerticalScrollview>

</LinearLayout>

回答by Shivam Dawar

This will scroll the EditTextand make it editable:

这将滚动EditText并使其可编辑:

First in the XML file, add this:

首先在 XML 文件中,添加以下内容:

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

Then in the Java file, add this:

然后在 Java 文件中添加:

EditText.setOnTouchListener(new View.OnTouchListener() {
       @Override
       public boolean onTouch(View view, MotionEvent motionEvent) {
           view.getParent().requestDisallowInterceptTouchEvent(true);
           switch (motionEvent.getAction() & MotionEvent.ACTION_MASK) {
               case MotionEvent.ACTION_SCROLL:
                  view.getParent().requestDisallowInterceptTouchEvent(false);
                   return true;
               case MotionEvent.ACTION_BUTTON_PRESS:
                   InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                   imm.showSoftInput(EditText, InputMethodManager.SHOW_IMPLICIT);
           }
           return false;
       }
});