android 禁用时将editText的内容省略

syqv5f0l  于 2023-01-11  发布在  Android
关注(0)|答案(5)|浏览(165)

我有一个布局,其中的EditText由用户填充,然后稍后它被禁用,无法作为标准的TextView。
问题是,省略号永远不会在这个EditText上起作用。我希望当文本太大而无法完全显示时,它会在文本的结尾显示“...”,但我找不到任何方法使它起作用,我不知道为什么它不起作用。
这是我的布局

<RelativeLayout
android:id="@+id/search_container"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_below="@+id/toolbar"
android:background="@drawable/bg_border_bot_clickable"
android:addStatesFromChildren="@+id/ic_edit"
android:animateLayoutChanges="true">

    <View
        android:layout_width="45dp"
        android:layout_height="45dp"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="5dp"
        android:layout_alignParentLeft="true"
        android:background="@drawable/ic_action_search"
        android:id="@+id/ic_search" />

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="10dp"
        android:textColorHint="@color/text_hint"
        android:hint="@string/search_hint"
        android:id="@+id/et_search"
        android:textColor="@android:color/white"
        android:inputType="text|textCapSentences"
        android:ellipsize="end"
        android:singleLine="true"
        android:lines="1"
        android:imeOptions="actionSearch"
        android:background="@drawable/transition_rounded_rectangle"
        android:layout_toLeftOf="@+id/ic_edit"
        android:layout_toRightOf="@+id/ic_search"
        />

<View
    android:layout_width="45dp"
    android:layout_height="45dp"
    android:layout_centerVertical="true"
    android:layout_alignParentRight="true"
    android:background="@drawable/ic_edit"
    android:id="@+id/ic_edit"
    android:visibility="gone"
    android:clickable="true"/>

有什么办法能做到吗?

lqfhib0f

lqfhib0f1#

将以下属性添加到EditText中,以便用省略号将内容括起来。

android:scrollHorizontally="true"
android:ellipsize="end"
android:singleLine="true"
android:editable="false"

如果不想在XML中默认将editable设置为false,可以通过调用setKeyListener(null)获得相同的结果。

editText.setKeyListener(null);
dxxyhpgq

dxxyhpgq2#

这是我的解决方案(我已经计算出来了):
XML文件:

<androidx.appcompat.widget.AppCompatEditText
    android:id="@+id/et2"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:layout_marginHorizontal="10dp"
    android:layout_marginTop="10dp"
    android:background="@drawable/selector_btn_check_red_grey"
    android:hint="Please enter characters"
    android:inputType="text"
    android:lines="1"
    android:paddingHorizontal="10dp"
    android:paddingVertical="5dp"
    android:text="就会角度打开的事开发的急啊看手机发就卡的房多少"
    android:textAllCaps="false"
    android:textColor="@color/red_500"
    android:textSize="15sp" />

java :

//Initialize to non-editable state
    et2.setKeyListener(null);
    et2.setEllipsize(TextUtils.TruncateAt.END);//setEllipsize只对hint有效果

    et2.setOnFocusChangeListener((v, hasFocus) -> {
        if (hasFocus) {
            //Editable status
            et2.setEllipsize(null);
            et2.setKeyListener(new TextKeyListener(TextKeyListener.Capitalize.NONE, false));
        } else {
            //Not editable[enter image description here][1]
            et2.setKeyListener(null);
            et2.setEllipsize(TextUtils.TruncateAt.END);
        }
    });
2fjabf4q

2fjabf4q3#

我认为省略号不适用于EditText。解决这个问题的一个方法是在EditText下面有一个带有省略号的TextView。最初将TextView可见性设置为GONE。当你想禁用EditText时,将其可见性设置为GONE,将文本分配给TextView,并将TextView可见性设置为VISIBLE。

tpxzln5u

tpxzln5u4#

正如您已经使用的:

android:ellipsize="end"

还有一件事需要添加。从java文件调用setSeleted(true)

EditText edit = (EditText) findViewById(R.id.editTextId);
edit.setSelected(true);

将id editTextId赋予您的EditText;

<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/editTextId" />
ars1skjm

ars1skjm5#

经过大量的测试,包括使用AppCompatEditText API,我可以说,@ChristianAbela解决方案无疑是在项目应支持从API 23(Android Marshmallow)开始的Android版本的场景中没有问题的解决方案。
在我的例子中,我还应该使字段EditText在用户将焦点返回到该字段后立即恢复正常(editText.keyListener != null)。
因此,如果您不能锁定EditText,但仍然需要显示省略号,那么下面的代码策略可能会很有用。

1-支持等级

首先,我将所有字段状态hackcode构建到一个支持类中:

import android.text.method.KeyListener
import android.widget.EditText

/**
 * The purpose of this class is to allow saving the status of the fields
 * present in the "Search estimate" page.
 *
 * Thus, it is possible to use a business logic where the fields present
 * on this page show, when there is large content, ellipsis indicating
 * that the content is even larger.
 */
class FieldDataStatusHolder {

    private var procedureFieldText: String = ""
    private var procedureFieldKeyListener: KeyListener? = null

    private var locationFieldText: String = ""
    private var locationFieldKeyListener: KeyListener? = null

    fun holdData(
        unfocusedField: EditText,
        procedureField: EditText
    ) {
        if (unfocusedField == procedureField) {
            procedureFieldText = unfocusedField.text.toString()
            procedureFieldKeyListener = unfocusedField.keyListener
        } else {
            locationFieldText = unfocusedField.text.toString()
            locationFieldKeyListener = unfocusedField.keyListener
        }

        /**
         * This binding to null is necessary because this is the core of
         * the hackcode. This makes the editable View (EditText or
         * subclasses) no longer editable and so the ellipses appear at
         * the end of the field.
         */
        unfocusedField.keyListener = null
    }

    fun retrieveHoldenData(
        focusedField: EditText,
        procedureField: EditText
    ) {
        if (focusedField == procedureField && procedureFieldKeyListener != null) {
            focusedField.keyListener = procedureFieldKeyListener

            if (focusedField.text.isNotEmpty()) {
                focusedField.setText(procedureFieldText)
            }
        } else if (locationFieldKeyListener != null) {
            focusedField.keyListener = locationFieldKeyListener

            if (focusedField.text.isNotEmpty()) {
                focusedField.setText(locationFieldText)
            }
        }
    }
}

在上面的代码中,不要被包含前缀或后缀(如 "Procedure""Location")的属性和变量搞混。
这是因为这些标签指向我应用代码的问题域。
屏幕上有两个字段,"搜索程序""搜索位置"
一旦用户从一个或两个字段中移去焦点,如果字段的内容比字段本身长,则省略号应该出现在可视组件的末尾。

2-黑客代码示例声明

在客户机类中,我在类作用域而不是函数作用域中惰性地添加了声明(但是您可以根据需要继续操作):

private val fieldDataStatusHolder by lazy {
    FieldDataStatusHolder()
}

3-在OnFocusChangeListener上执行

因此,有必要在我已经创建的OnFocusChangeListener生成器方法中添加FieldDataStatusHolder示例的逻辑执行:

private fun getFieldFocusChangeListener() = View.OnFocusChangeListener { view, hasFocus ->
    
    // I do have lots of more domain code here.

    if (hasFocus) {
        fieldDataStatusHolder.retrieveHoldenData(
            focusedField = view as EditText,
            procedureField = etProcedureField
        )
    } else {
        fieldDataStatusHolder.holdData(
            unfocusedField = view as EditText,
            procedureField = etProcedureField
        )
    }
}

此方法用于初始化字段上的侦听器,如下所示:

etProcedureField.onFocusChangeListener = getFieldFocusChangeListener()
etLocationField.onFocusChangeListener = getFieldFocusChangeListener()

4-XML中的视图

最后,必须将以下属性和值添加到EditText中:

  • android:ellipsize="end";
  • android:maxLines="1".

请注意,即使对于Android 23,我也不需要以下属性:

  • android:singleLine(已弃用);
  • 一米一米一。

另一个要点是......我实际上对每个字段使用了以下可视化组件:

  • TextInputLayout;
  • TextInputEditText的数据。

而且TextInputLayout组件包含一个endIcon,因此,每次字段失去焦点,以至于出现省略号(Android API 31+)时,我也会隐藏endIcon
但是,为了避免使答案更加冗长,我在这里不添加这个算法。
是的,这里的代码应该不仅适用于EditText,而且适用于它的任何子类。

结果

具有焦点的字段:

无焦点的字段:

相关问题