web-dev-qa-db-ja.com

スクロールビュー内で編集テキストをスクロールする方法

私はmultilineである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

みんな助けてくれませんか。 editTextは、カーソルがその中にあるときにフォーカスを得ていると思います。

ありがとう.. !!!!!

41
Maveňツ

これを試して..

以下の行をEditTextに追加します

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

   <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 [〜#〜]

プログラムで

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

最初にこれをXMLに追加します

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

次に、「OnTouch」の上に同じものを追加しますが、「true」ではなく「false」を返します

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;
}
62
Ayman Mahgoub

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

動作しているこのコードを使用

XMLで

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

プログラミング中

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

@Ayman Mahgoubと@Hariharanの回答に基づいて作成します。このソリューションは、編集テキストをスクロールしているときにスクロールの勢いがないことを除いて、非常にうまく機能しました。指を持ち上げるとすぐに、スクロールがすぐに停止します。

スクロールの勢いを得るには、EditTextの周りにscrollviewをラップし、EditTextの高さでコンテンツをラップします(必要に応じてminHeightを設定します)。編集テキストから次の行を削除します。

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

これで、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; 

注意してください、このソリューションはビュー階層に密接に結合されています。

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

4
Adam

@Ayman Mahgoubが提供する更新された回答に賛成票を投じますが、十分な評判はありません。彼のコードは動作します。 falseを返すにはtrueを変更する必要がありました。 .setOnTouchListener()メソッドをJavaクラスに追加し、次の3行を追加します。

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

対応するxmlファイル。実装は、Androidエミュレーター、およびAndroidテストで使用する電話で確認できます。@ Ayman Mahgoubと@Hariharanに感謝します。

2
mas945846

以下の回答は、スクロールビュー内でテキストの編集をスクロール可能にし、そのカウントも表示するのに役立ちます。

1. @drawableフォルダーに1つの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.次に、@ 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.次に、アクティビティまたはフラグメント内で以下のコードを記述します。

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

ハッピーコーディング......

1
SWAPDROiD

Kotlinバージョン

次の行をxmlのEditTextに追加します。

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

これをアクティビティ/フラグメントに追加します。

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
}
1
vovahost

最初に、次のようにカスタム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. これで、EditTextを使用しているアクティビティまたはフラグメントで、Scrollview内でスクロールするEditTextオブジェクトに対して次のコードを記述します。

    import Android.support.v7.app.AppCompatActivity; import Android.os.Bundle; import Android.view.MotionEvent; import Android.view.View; import 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.以下の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>
0
Ayan

これにより、EditTextがスクロールされ、編集可能になります。

最初にXMLファイルで、これを追加します。

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

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