29

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

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

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

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

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

4

6 回答 6

78

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

android:textAlignment="viewStart"

于 2014-02-27T22:21:49.867 回答
5

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

于 2013-09-27T15:23:08.067 回答
1

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

TextView 的 android 源代码片段。

// 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;
        }
于 2017-12-04T11:05:10.023 回答
1

在我的情况下,两者都工作得很好。

1) android:textAlignment="viewStart"

2)

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

于 2018-10-10T05:47:18.597 回答
1

就我而言,只需layout_widthwrap_content.

于 2017-02-26T08:25:06.380 回答
0

正确的答案是:

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

}

于 2020-01-10T17:32:36.823 回答