How to scroll the edittext inside the scrollview

AndroidUser InterfaceScrollview

Android Problem Overview


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.

<?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.

Thanks..!!!!!

Android Solutions


Solution 1 - Android

Try this..

Add below lines into your 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;
       }
});

Solution 2 - Android

First add this at XML

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

Then add the same above "OnTouch" but make it return "false" not "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;
}

Solution 3 - Android

Kotlin version

Add the following lines to the EditText in your xml:

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
}

Solution 4 - Android

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

<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>			

Solution 5 - Android

Use this code it's working

In 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;
    }
});

Solution 6 - Android

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.

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:

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:

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

Solution 7 - Android

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:

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!

Solution 8 - Android

This will scroll the EditText and make it editable:

First in the XML file, add this:

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

Then in the Java file, add this:

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;
       }
});

Solution 9 - Android

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.

 <?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.

<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:

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......

Solution 10 - Android

First create a custom Scrollview class as given below:

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;
    }
}

2. 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;
            }
        });
    }
}

3.The follwing xml is given below:

<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>

Solution 11 - Android

Thanks to Hariharan, vovahost I got the same solution, but added performClick() to avoid a warning.

EditText (XML):

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

Code:

edit_text.setOnTouchListener { view, event ->
    view.parent.requestDisallowInterceptTouchEvent(true)
    if ((event.action and MotionEvent.ACTION_MASK) == MotionEvent.ACTION_SCROLL) {
        view.parent.requestDisallowInterceptTouchEvent(false)
    } else {
        performClick()
    }
    return@setOnTouchListener false
}

Solution 12 - Android

The simplest way is by doing Extention in Kotlin:

First add this extension:

fun EditText.enableScrollText()
{
    overScrollMode = View.OVER_SCROLL_ALWAYS
    scrollBarStyle = View.SCROLLBARS_INSIDE_INSET
    isVerticalScrollBarEnabled = true
    setOnTouchListener { view, event ->
        if (view is EditText) {
            if(!view.text.isNullOrEmpty()) {
                view.parent.requestDisallowInterceptTouchEvent(true)
                when (event.action and MotionEvent.ACTION_MASK) {
                    MotionEvent.ACTION_UP -> view.parent.requestDisallowInterceptTouchEvent(false)
                }
            }
        }
        false
    }
}

and finally easily call this for your edittext:

editText.enableScrollText();

This extention works well in any case like inside ScrollView or RecyclerView or BottomSheet

Solution 13 - Android

Add this method in main activity:

It worked for me in Fragment

 @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            View v = getCurrentFocus();
            if (v instanceof EditText) {
                Rect outRect = new Rect();
                v.getGlobalVisibleRect(outRect);
                if (!outRect.contains((int) event.getRawX(), (int) event.getRawY())) {
                    v.clearFocus();
                    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
                }
            }
        }
        return super.dispatchTouchEvent(event);
    }

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMaveňツView Question on Stackoverflow
Solution 1 - AndroidHariharanView Answer on Stackoverflow
Solution 2 - AndroidAyman MahgoubView Answer on Stackoverflow
Solution 3 - AndroidvovahostView Answer on Stackoverflow
Solution 4 - AndroidHungNM2View Answer on Stackoverflow
Solution 5 - AndroidKeshav GeraView Answer on Stackoverflow
Solution 6 - AndroidAdamView Answer on Stackoverflow
Solution 7 - Androidmas945846View Answer on Stackoverflow
Solution 8 - AndroidShivam DawarView Answer on Stackoverflow
Solution 9 - AndroidSWAPDROiDView Answer on Stackoverflow
Solution 10 - AndroidAyanView Answer on Stackoverflow
Solution 11 - AndroidCoolMindView Answer on Stackoverflow
Solution 12 - AndroidAmir Hossein GhasemiView Answer on Stackoverflow
Solution 13 - AndroidMEGHA DOBARIYAView Answer on Stackoverflow