如何在 scrollview 中滚动编辑文本

我有一个滚动视图,其中有一个编辑文本是 多线电话。我想滚动编辑文本,看到较低的内容,但这是不可能的。

<?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 里面的时候,它正在获得焦点。

谢谢!

69126 次浏览

试试这个。

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>

剪辑

以程序化的方式

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

首先将它添加到 XML

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

然后在“ 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;
}

我会对@Ayman Mahgoub 提供的最新答案投赞成票,但我的声望不够高。他的准则行得通。我不得不改变回真回假。你把。SetOnTouchListener ()方法,并将三行:

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

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

作者:@Ayman Mahgoub 和@Hariharan。除了在滚动编辑文本时没有滚动动量外,这个解决方案非常有效。手指一抬起,滚动就立即停止了。

为了获得滚动动量,在 EditText 周围包装一个滚动视图,并让 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

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

使用这个代码,它的工作

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

这将滚动 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;
}
});

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

1. 在@draable 文件夹中创建一个矩形 _ with _ orders _ 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>

然后,在@布局中,在滚动视图中写入下面的代码。

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

然后,在你的活动或片段中写下如下代码:

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

快乐编码... ..。

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
}

首先创建一个自定义 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 对象编写以下代码:

    导入 android.support. v7.app. AppCompatActivity; 导入 android 操作系统 事件; 视图; 导入 android.widget.EditText;

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

将此方法添加到主要活动中:

在《碎片》里我就是这么做的

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

感谢 哈里哈兰Vovohost我得到了相同的解决方案,但增加了 performClick(),以避免一个警告。

编辑文本(XML) :

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

密码:

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
}

最简单的方法是在 Kotlin 进行扩展:

首先添加这个扩展:

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

最后,在编辑文本中轻松调用:

editText.enableScrollText();

这个扩展在任何情况下都可以很好地工作,比如在 ScrollViewRecyclerViewBottomSheet