【问题标题】:Android RTL password fields?Android RTL 密码字段?
【发布时间】:2020-01-11 01:58:38
【问题描述】:

看来,如果你在 android 上有一个 EditText

android:inputType="textPassword"android:password="true

字段,从右到左的文本不会从右到左显示(保持从左到右)。

但是,如果没有密码表示,文本确实会出现 RTL。

这是一个已知问题还是有解决方法?

【问题讨论】:

  • FWIW,我在b.android.com 没有看到为此提出的问题。
  • 在我报告它之前我会尝试更多的设备

标签: android


【解决方案1】:

对于 17+ (4.2.x+),您可以使用 textAlignment

android:textAlignment="viewStart"

【讨论】:

  • 对于 4.2.x+,是的。这在 appcompat 库中仍然不存在,因此如果您想在 2.3 或 4.0 中执行此操作,则必须使用其他解决方案。
  • 这对我不起作用,我报告了这个问题:code.google.com/p/android/issues/…
  • 几乎成功了。对我来说,它显示一切都很好,它只是在从左到右布局时将光标放在提示之后
  • 现在 4.2+ 已占多数,将其切换为答案。
  • 值得一提的是,这需要在应用清单中的<application> 元素上添加android:supportsRtl="true"
【解决方案2】:

我发现的唯一解决方案是在设置 inputType 后以编程方式将重力设置为 LEFT 或 RIGHT。

【讨论】:

  • 您可以考虑将该问题作为评论添加到您的答案中。
  • 是的。这最终成为唯一的方法。
【解决方案3】:

就我而言,只需将layout_width 更改为wrap_content 即可解决问题。

【讨论】:

  • 您可以通过在 XML 文件中设置一个属性来设置 EditText(密码字段)的对齐文本:extAlignment=viewStart
【解决方案4】:

如果在 EditText 上设置 inputType = textPassword 或设置 passwordTransformation 方法,文本方向将被视为 LTR。这意味着不鼓励密码的 RTL。您需要编写自定义 TextView 来覆盖此行为。

TextView 的 Android 源代码 sn-p。

// PasswordTransformationMethod always have LTR text direction heuristics returned by
        // getTextDirectionHeuristic, needs reset
        mTextDir = getTextDirectionHeuristic();


protected TextDirectionHeuristic getTextDirectionHeuristic() {
        if (hasPasswordTransformationMethod()) {
            // passwords fields should be LTR
            return TextDirectionHeuristics.LTR;
        }

【讨论】:

    【解决方案5】:

    在我的情况下,两者都运行良好。

    1) android:textAlignment="viewStart"

    还有

    2)

    https://stackoverflow.com/a/38291472/6493661

    【讨论】:

      【解决方案6】:

      正确答案是:

      RtlEditText mUserPassword = root.findViewById(R.id.register_fragment_password);
      mUserPassword.setTransformationMethod(new AsteriskPasswordTransformationMethod());
      

      创建我们自己的 EditText!

      只有在此代码下方用 AsteriskPasswordTransformationMethod 将点替换为 astrix 时,它才能完美运行。

      public class RtlEditText extends EditText {
      
      
      public RtlEditText(Context context) {
          super(context);
      }
      
      public RtlEditText(Context context, @Nullable AttributeSet attrs) {
          super(context, attrs);
      }
      
      public RtlEditText(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
          super(context, attrs, defStyleAttr);
      }
      
      public RtlEditText(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
          super(context, attrs, defStyleAttr, defStyleRes);
      }
      
      @Override
      public TextDirectionHeuristic getTextDirectionHeuristic() {
              // passwords fields should be LTR
              return TextDirectionHeuristics.ANYRTL_LTR;
      }}
      
      
      
      public class AsteriskPasswordTransformationMethod extends PasswordTransformationMethod {
      @Override
      public CharSequence getTransformation(CharSequence source, View view) {
          return new PasswordCharSequence(source);
      }
      
      private class PasswordCharSequence implements CharSequence {
          private CharSequence mSource;
          public PasswordCharSequence(CharSequence source) {
              mSource = source; // Store char sequence
          }
          public char charAt(int index) {
              return '*'; // This is the important part
          }
          public int length() {
              return mSource.length(); // Return default
          }
          public CharSequence subSequence(int start, int end) {
              return mSource.subSequence(start, end); // Return default
          }
      }
      

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-11
        • 2012-03-20
        • 1970-01-01
        • 2020-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多