什么可以影响android:ems大小?

时间:2016-11-30 15:34:55

标签: android

我有一个带layout_width="wrap_content"的简单EditText。属性中没有填充或边距。这是一个完整的例子:

    <EditText
        android:id="@+id/maskPrefix"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="3"
        android:inputType="text|textCapCharacters|textNoSuggestions"
        android:maxLength="5"
        android:maxLines="1"
        android:nextFocusDown="@+id/maskNum"
        android:text="GA"
        android:textSize="18sp"
        tools:ignore="LabelFor" />

一切都很好但是......但是:

  1. 当我将ems设置为1时,它大约是1个字符宽;
  2. 当我将ems设置为2时,它大约是2.5个字符;
  3. 当我将ems设置为3时,它大约是4.5个字符宽;
  4. 当我将ems设置为4时,它大约是6个字符;
  5. 当我将ems设置为5时,它大约是10个字符;
  6. 当我将ems设置为10时,它大约有20个字符宽;
  7. 如果我删除android:ems并通过android:maxLength设置最大宽度,那么一切都是合适的宽度。但我需要两个属性。

    为什么我的EditText宽度错了?这个神秘倍增器有什么用?我使用Theme.AppCompat.Light.NoActionBar,最新的android studio(2.2.2)并使用

    进行编译
    compile "com.android.support:support-v4:25.0.1"
    compile 'com.android.support:appcompat-v7:25.0.1'
    

    在Nexus 5中使用Android 6进行测试。

    什么选项或属性会让android:ems如此糟糕?

    UPD 即可。链接到this question无法以任何方式解决我的问题。此外,设置android:textSizeandroid:ems是绝对正确的。我希望我的文字字母 x sp大,我希望我的EditText y 字符宽。

1 个答案:

答案 0 :(得分:3)

好的,我找到了罪魁祸首。我认为所有字符的ems大小 x 总是相同的。但我完全忘记了我们有monospace和比例字体。当我们将ems设置为 x 时,它将 x * y ,其中 y 是最宽字母(通常为M)的宽度。但其他字母的宽度会更小。 这张照片很清楚:

M is wider then 1

“M”字母比“1”宽得多!

解决方案:我们只需切换到等宽字体,例如serif-monospace

monospace font is cool