【问题标题】:Letter spacing in Android EditTextAndroid EditText 中的字母间距
【发布时间】:2017-05-16 17:40:15
【问题描述】:

我正在尝试显示一个用空格分隔的字母的文本框。

    EditText wordText = (EditText) findViewById(R.id.word_text);
    wordText.setPaintFlags(wordText.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
    InputFilter[] filterArray = new InputFilter[2];
    filterArray[0] = new InputFilter.AllCaps();
    filterArray[1] = new InputFilter.LengthFilter(10);
    wordText.setGravity(Gravity.CENTER);

这是布局文件。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/match_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center_horizontal"
    android:layout_marginTop="100dp">

    <EditText android:id="@+id/word_text"
        android:layout_width="200dip"
        android:layout_height="wrap_content"
        android:hint="Your Word"
        android:maxLength="15"
        android:inputType="textCapWords"/>

    <Button
        android:id="@+id/match_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ellipsize="start"
        android:text="Match"
        android:layout_marginTop="50dp"/>
</LinearLayout>

如何在 API 12 中的字母之间添加空格。我不想使用 setLetterSpacing()。

另外,当我开始输入时,setGravity(Gravity.CENTER) 导致我的字母从框的中心出现。我如何让它从左到右出现?如果我设置 Gravity.LEFT,EditText 本身会在 LinearLayout 中向左移动。谁能帮忙?

【问题讨论】:

  • 为什么你不想使用 setLetterSpacing()?对于文本的对齐,请在您的 XML 布局或适当的 API 函数中使用 android:layout_gravity="left"。它还可以询问您 android:layout_gravity="start" 的使用情况。
  • 我建议你也添加布局文件,
  • 正如我所提到的,我收到编译器错误,因为我的 minSdk 是 API 12,其中 setLetterSpacing 不可用。当我使用 Gravity.Left 时,我的 EditText 本身会移动到屏幕的左侧。我希望它位于中心,但是当我键入时,字母应该从左侧出现。有可能这样做吗?

标签: android android-layout android-edittext


【解决方案1】:

多年来,字母间距的主题似乎引起了相当多的流量。一些人提倡使用textScaleX 属性,但这本身并不是一个可接受的解决方案,因为它也会歪曲字母。提到的其他几个解决方案是:

  1. 创建自定义字体并在其中添加您自己的间距。虽然它很复杂,因为它涉及版权和字母之间不那么动态的间距
  2. 在字母之间添加空格 - 也不太理想,因为在增加间距值时没有足够的粒度
  3. textScaleX 和在字母之间添加空格的组合 - 它涉及一个自定义视图,其中 textScaleX 仅应用于空格 - 因此字母保持不变,只有空格增加 - 减少。您也可以使用不可破坏的空格 unicode 字符。对于此解决方案,您可以查看 Change text kerning or spacing in TextView?

【讨论】:

    【解决方案2】:
    1. 制作TextWatcher(此示例仅在EditText字段中输入数字,您可以根据需要进行更改)

      public class CustomTextWatcher implements TextWatcher{
      
          private static final char space = ' ';
      
      public CodeTextWatcher (){}
      
      @Override
      public void beforeTextChanged(CharSequence s, int start, int count, int after) {
      
      }
      
      @Override
      public void onTextChanged(CharSequence s, int start, int before, int count) {
      }
      
      @Override
      public void afterTextChanged(Editable s) {
      
          // Remove all spacing char
          int pos = 0;
          while (true) {
              if (pos >= s.length()) break;
              if (space == s.charAt(pos) && (((pos + 1) % 2) != 0 || pos + 1 == s.length())) {
                  s.delete(pos, pos + 1);
              } else {
                  pos++;
              }
          }
      
          // Insert char where needed.
          pos = 1;
          while (true) {
              if (pos >= s.length()) break;
              final char c = s.charAt(pos);
              // Only if its a digit where there should be a space we insert a space
              if ("0123456789".indexOf(c) >= 0) {
                  s.insert(pos, "" + space);
              }
              pos += 2;
          }
      }
      

      }

    2. 将此 textWatcher 附加到您的 EditText:

       EditText.addTextChangedListener(new CustomTextWatcher());
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-19
      • 2014-02-19
      • 2012-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多