web-dev-qa-db-fra.com

Comment faire défiler l'edittext dans le scrollview

J'ai un scrollview dans lequel se trouve un editext qui est multiline . Je veux faire défiler l'edittext pour voir le contenu inférieur mais cela ne peut pas être fait.

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

Pouvez-vous les gars m'aider dans cela. Je pense que editText devient le focus lorsque le curseur est à l'intérieur.

Merci..!!!!!

35
Maveňツ

Essaye ça..

Ajoutez les lignes ci-dessous dans votre EditText

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

Exemple

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

MODIFIER

Par programme

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

D'abord ajouter ceci à XML 

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

Puis ajoutez la même chose "OnTouch" ci-dessus mais faites-la retourner "false" et non "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;
}
57
Ayman Mahgoub

vous devriez utiliser la classe NestedScrollView. Cette classe prend en charge le défilement enfant dans le défilement parent. Cette classe peut être un enfant ou un 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>           
8
HungNM2

S'appuyant sur la réponse de @Ayman Mahgoub et @Hariharan. La solution a bien fonctionné, sauf que lors du défilement du texte édité, il n'y a pas de moment de défilement. Dès que le doigt se lève, le défilement s'arrête immédiatement. 

Pour gagner du temps, faites défiler une vue de défilement autour du texte EditText et laissez le contenu de contenu en hauteur de ce dernier (définissez minHeight si vous le souhaitez). Supprimez les lignes suivantes du texte d'édition:

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

Maintenant, le ScrollView imbriqué qui entoure le EditText prend en charge le défilement. Mettez à jour le gestionnaire onTouch pour prendre en compte la hiérarchie de vues mise à jour:

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; 

Soyez averti, cette solution est maintenant étroitement liée à la hiérarchie des vues.

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

3
Adam

Utilisez ce code ça marche  

En XML  

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

En programmation  

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

Je voterais la réponse mise à jour fournie par @Ayman Mahgoub, mais je n'ai pas une réputation assez élevée. Son code fonctionne. J'ai dû changer return true pour retourner false. Vous mettez la méthode .setOnTouchListener () dans votre classe Java et mettez les trois lignes:

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

dans le fichier XML correspondant. Vous pouvez voir l'implémentation dans l'émulateur Android et sur le téléphone Android que vous utilisez pour les tests. Merci beaucoup @Ayman Mahgoub et @Hariharan! 

2
mas945846

La réponse ci-dessous vous aidera à faire défiler le texte d'édition dans la vue défilement et à en afficher le nombre.

1. Créez un fichier rectangle_with_border_gray.xml dans le dossier @drawable.

 <?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.Puis, dans @layout, écrivez ci-dessous le code en mode défilement.

<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. Ensuite, dans votre activité ou votre fragment, écrivez ci-dessous le 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) {
            }
        };

Bonne codage ......

1
SWAPDROiD

Commencez par créer une classe Scrollview personnalisée comme indiqué ci-dessous:

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. Désormais, dans l'activité ou le fragment dans lequel vous utilisez EditText, écrivez le code suivant pour l'objet EditText que vous souhaitez faire défiler dans la vue de défilement:

    importer Android.support.v7.app.AppCompatActivity; importer Android.os.Bundle; importer Android.view.MotionEvent; importer Android.view.View; .__ importer Android.widget.EditText ;

    classe publique MainActivity étend 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.La suite xml est donnée ci-dessous:

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

Cela fera défiler la EditText et la rendre éditable:

Tout d'abord dans le fichier XML, ajoutez ceci:

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

Ensuite, dans le fichier Java, ajoutez ceci:

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;
       }
});
0
Shivam Dawar

Version Kotlin

Ajoutez les lignes suivantes à EditText dans votre XML:

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

Ajoutez ceci à l'activité/au 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
}
0
vovahost