看来如果你在Android上有一个带有
的EditText android:inputType="textPassword"
或android:password="true
上的字段,从右到左的文字不会从右到左显示(从左到右)。
但是,如果没有密码标记,则文本会显示为RTL。
这是一个已知问题还是有解决方法?
答案 0 :(得分:56)
对于17+(4.2.x +),您可以使用textAlignment
机器人:textAlignment = “viewStart”
答案 1 :(得分:5)
我找到的唯一解决方案是在设置输入类型后以编程方式将引力设置为LEFT或RIGHT。
答案 2 :(得分:1)
就我而言,只需将layout_width
更改为wrap_content
即可解决问题。
答案 3 :(得分:0)
如果在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;
}
答案 4 :(得分:0)
就我而言,两者都工作正常。
1)android:textAlignment =“ viewStart”
还有
2)
答案 5 :(得分: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
}
}
}