Android RTL密码字段?

Android RTL密码字段?,android,Android,如果您在android上有一个带有 android:inputType=“textPassword”或android:password=“true 字段上,从右到左的文本不会从右到左显示(保持从左到右) 但是,如果没有密码指示,文本将显示为RTL 这是一个已知的问题还是有解决方法?我找到的唯一解决方案是在设置输入类型后通过编程将重力设置为向左或向右。对于17+(4.2.x+)您可以使用 android:textAlignment=“viewStart“在我的例子中,通过将layout\u wid

如果您在android上有一个带有

android:inputType=“textPassword”
android:password=“true

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

但是,如果没有密码指示,文本将显示为RTL


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

我找到的唯一解决方案是在设置输入类型后通过编程将重力设置为向左或向右。

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


android:textAlignment=“viewStart“

在我的例子中,通过将
layout\u width
更改为
wrap\u content

简单地解决了这个问题。如果您将inputType=textPassword或在EditText上设置密码转换方法,文本方向将被视为LTR。这意味着不鼓励使用RTL进行密码转换。您需要编写自定义TextView来覆盖此行为

来自android源代码的TextView代码片段

// 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;
        }

就我而言,这两种方法都很有效

1) android:textAlignment=“viewStart”

(二)


正确的答案是:

RtlEditText mUserPassword = root.findViewById(R.id.register_fragment_password);
mUserPassword.setTransformationMethod(new AsteriskPasswordTransformationMethod());
创建我们自己的编辑文本

只有在此代码下面用astrix替换星号kPasswordTransformationMethod,它才能很好地工作

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
    }
}

我没有看到这方面的问题。在我报告之前,我会尝试更多的设备。你可以考虑把这个问题作为评论添加到你的答案中。这是唯一的方法。对于4.2.x+,是的。这在appcompat库中仍然不存在,因此如果您想在2.3或4.0中实现这一点,您必须使用其他解决方案。这对我不起作用,我在上报告了问题:几乎起作用。对我来说,它可以很好地显示所有内容,在从左到右的布局中,它只是将光标放在提示之后,现在4.2+占据了大多数。值得一提的是,这需要在应用程序清单中的
元素上设置
android:supportsRtl=“true”
。您可以设置EditText的对齐文本(密码字段),在XML文件中设置一个属性:extAlignment=viewStart