簡體   English   中英

Android RTL密碼字段?

[英]Android RTL password fields?

看來,如果你在 android 上有一個 EditText

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

字段,從右到左的文本不會從右到左顯示(保持從左到右)。

但是,如果沒有密碼符號,文本確實會出現 RTL。

這是一個已知問題還是有解決方法?

對於 17+ (4.2.x+) 你可以使用textAlignment

android:textAlignment="viewStart"

我發現的唯一解決方案是在設置 inputType 后以編程方式將重力設置為 LEFT 或 RIGHT。

在我的情況下,問題是通過將layout_width更改為wrap_content來解決的。

如果在 EditText 上設置 inputType = textPassword 或設置 passwordTransformation 方法,則文本方向將被視為 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"

並且

2)

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

正確答案是:

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

創建我們自己的 EditText!

僅當您通過此代碼下方的 AsteriskPasswordTransformationMethod 用星號替換點時,它才能完美地工作。

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

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM