在Android中,如何创建固定宽度的EditText?

47

我想创建一个EditText,只接受数字,最多为4个数字,并且永远不会比填入4个数字时更窄(为空时不会收缩或扩展以容纳4个数字,因此它是固定的。)

前两个要求可以通过设置: android:inputType="number" 和 android:maxLength="4" 来实现。

如何设置最小长度?


答案:您可以使用以下代码来设置EditText的最小长度: android:minWidth="40dp" 其中40dp表示EditText的宽度,即使没有值,也应始终保持这个宽度。

是否排除(excludes)或包含(includes)? - B. Clay Shannon-B. Crow Raven
11个回答

104

一个很少使用(据我所知)但你可以使用的EditText属性是:

android:ems="4"

这将使EditText的宽度恰好为4个字体单位。一个字体单位的宽度是选择字体中最宽字符(M)的宽度。


6
这个方法可以用,但因为我只允许数字输入,所以4 em 的宽度比实际需要的要宽得多。虽然我可以尝试调整来得到更好的宽度,但还是有点不够精确。 - ab11
对我来说完美地工作了。我只需要一个固定长度的文本字段,它可以包含1到5个数字,并且无论用户输入了多少位数字都能看起来很好。 - ArtOfWarfare
1
也许这很少见,但我经常在布局中使用它,当我需要实现相等的字段长度时。如果字体或字体大小发生变化,它会自适应,而不像基于像素设置不变长度的解决方案。 - John Jorsett
注意:这将禁用多行文本,而是允许换行。 - Don Larynx
如果你想用Java实现这个,可以使用setEms(int)方法。 - Jey10
@kcoppock,能不能请您看一下这里的一个安卓问题:http://stackoverflow.com/questions/36968503/android-cannot-update-listview-on-changing-an-edittext-value? - Istiaque Ahmed

40

有点“hackish”,但是你可以将你的EditText放在一个FrameLayout里,同时再放一个text="0000"visibility=invisible.TextView

FrameLayout应该有width=wrap_content,而你的EditText将有width=match_parent
这样应该总是使它具有正确的宽度。

这种方法的好处是,它完全是XML侧面的,没有涉及到代码。

<FrameLayout
 android:layout_width="wrap_content"
 android:layout_height="wrap_content">

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="0000"
    android:visibility="invisible" />

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:inputType="number"
    android:maxLength="4" />
</FrameLayout>

这实际上比kcoppock的答案更好,因为它会产生一个精确右侧的textview。但是,肯定是hackish。 - ab11
我尝试按照Jean所说的去做,但由于某些原因我无法完成。最终我使用了提示。 - Quv
2
在现代的约束布局时代,这个小技巧对于固定宽度的数字编辑框实际上可以非常有效。你只需要将EditText限制到不可见的TextView上,就不需要嵌套布局了。 - Dave S

22
在我的情况下,我需要视图宽度为6个数字。android:ems使得该字段太宽了(因为M字符比数字要宽)。我最终使用透明提示符来规定该字段的最小宽度。下面的示例宽度为六个数字。
<EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:hint="000000"
        android:textColorHint="#00FFFFFF"
        android:maxLength="6"
        android:inputType="numberPassword" />

这个解决方案与字体、字距和其他可能变化的事物无关。textColorHint 是一种 0% 不透明度的白色,因此提示永远不应该对用户可见。


这是最简单的解决方案,效果最好。kcoppock的解决方案对我没有起作用。 - Chandra Sekhar

10

你也可以尝试使用...

android:ems="4"
android:maxEms="4"
android:layout_width="wrap_content"

这会确保在默认的Android edittext样式下,尽可能地实现最紧密的拟合。

如果您需要更多关于左右填充的控制,您可以使用:

android:background="#ffffff"
android:paddingLeft="0dp"
android:paddingRight="0dp"

2

使用android:width="XXX.Xdp"

这可以让你以密度像素为单位设置宽度,应该相对于屏幕密度。我曾尝试使用基于ems的方法来设置一个宽度为2个字符的字段,但由于ems需要一个整数,2太小了,3太大了。很烦人。


1
有一种非常简单的编程方式可以实现这个。
myEditText.setLayoutParams(new LinearLayout.LayoutParams(200, 50));

这会将宽度设置为200,高度设置为50!祝愉快 :)

当然,您需要手动查看四个字符的宽度,但我仍然认为这是手动设置EditText宽度和高度的一种非常流畅的方式! - wea

0

不清楚是否有内置解决方案,但您可以尝试在提交时被动检查长度并弹出带有错误消息的对话框。


0
问题在于EditText小部件可能会因为许多不同的操作而失去焦点,例如触摸其他敏感视图、菜单按钮或(硬键盘光标控制)等。最大长度或输入类型的限制可以在打字过程中完成(如果字符通过了过滤器或长度未超过,则接受该字符)。但是,焦点丢失可能随时发生 - 即使提交尚未完成并且输入过短 -> 因此,没有内置的最小长度解决方案,因为应用程序将在此处阻止执行另一个事件或任务的执行。至少在进入工作流的下一步之前,您必须验证您的输入。

0

我使用android:layout_width="60dip",所以同意Mike Fratto的观点。

ems解决方案似乎也很有趣。

Phil


0

当您输入的字符超过EditText宽度时,可以设置对齐方式来增加宽度或EditText宽度。请设置上述视图的toLeftOf和toRightOf以管理这些内容。只有一个解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接