提示对齐密码EditText的右侧

时间:2016-02-15 07:31:55

标签: android android-edittext right-to-left

我正在研究和使用阿拉伯语进行活动。我希望用户名和密码的提示从右侧开始,我没有问题从左侧开始输入,但在我的UI中我希望提示是正确的。但是当我为EditText添加inputType时,提示会向左移动。我尝试以编程方式解决它,但它不起作用。

爪哇

    EditText password = (EditText) findViewById(R.id.input_password);
    password.setTypeface(Typeface.DEFAULT);

XML

<EditText
            android:id="@+id/input_password"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:hint="كلمة المرور"
            android:textColorHint="#FFFFFF"
            android:inputType="textPassword"
            android:background="@null"
            android:textColor="#FFFFFF"
            android:textSize="20dp"/>

8 个答案:

答案 0 :(得分:7)

对于Android 4.4+中的EditText字段,这是Android框架中的错误:https://issuetracker.google.com/issues/37082815https://code.google.com/p/android/issues/detail?id=201471。截至2016年7月,目前尚未解决。

但是有办法解决它:

  • 要使提示正确显示在右侧(从右到左/ RTL模式),您必须删除 InputType属性textPassword({{1} }),当没有输入文字时。

  • 要保留显示点以隐藏键入文本的密码输入字段行为,您必须动态启用 InputType.TYPE_TEXT_VARIATION_PASSWORD,输入第一个字符时。必须是删除所有字符时重置。

  • 为了防止拉丁字符输入的UI故障(像“abc123”这样的LTR文本)向左跳跃或完全消失,您必须将textDirection显式设置为RTL

以下是详细信息:

InputType.TYPE_TEXT_VARIATION_PASSWORD的先决条件:

AndroidManifest.xml

您的XML布局包含:

<application
    ...
    android:supportsRtl="true"
    ... >
</application>

带有解决方法错误修复的Java代码:

     <EditText
        android:id="@+id/password"
        android:inputType="textPassword"
        android:hint="סיסמא"
        ... />

它应该像这样工作:

Video screenshot, Arabic: Hint on right, password typed on right

答案 1 :(得分:5)

使用重力属性调整EditText的提示

        <EditText
        android:id="@+id/input_password"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:hint="كلمة المرور"
        android:textColorHint="#FFFFFF"
        android:gravity="right"
        android:inputType="textPassword"
        android:background="@null"
        android:textColor="#FFFFFF"
        android:textSize="20dp"/>

答案 2 :(得分:1)

以这种方式添加重力this.refs.first.blur()

right

如果您的API级别为17或更高,则可以使用

<EditText
            android:id="@+id/input_password"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:hint="كلمة المرور"
            android:textColorHint="#FFFFFF"
            android:inputType="textPassword"
            android:background="@null"
            android:textColor="#FFFFFF"
            android:textSize="20dp"
            android:gravity="right"/>

答案 3 :(得分:0)

使用&#39; gravity&#39;属性:

<EditText
    android:id="@+id/input_password"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:hint="كلمة المرور"
    android:textColorHint="#FFFFFF"
    android:gravity="right"
    android:inputType="textPassword"
    android:background="@null"
    android:textColor="#FFFFFF"
    android:textSize="20dp"/>

答案 4 :(得分:0)

我认为您可以通过在希伯来语/阿拉伯语(或任何其他RTL语言)文本中添加\u202B来解决此问题。

示例:

<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

    <EditText android:hint="Enter a number..." android:id="@+id/editText"
              android:layout_width="match_parent"
              android:layout_height="wrap_content" android:inputType="number"/>

    <EditText android:hint="\u202Bהכנס מספר..." android:id="@+id/editText2"
              android:layout_width="match_parent"
              android:layout_height="wrap_content" android:inputType="number"/>
</LinearLayout>

可悲的是,它似乎没有在布局预览中显示,但它在真正的设备上对我有用。写下here

答案 5 :(得分:0)

对于AppCompatEditText,编辑文本重力开始对我有用

<androidx.appcompat.widget.AppCompatEditText
        ......
        android:hint="كلمه السر"
        android:inputType="textPassword"
        android:gravity="start"
       .............../>

这仅在api 16以上有效

您也可以尝试,您必须在其中存储了当前语言的地方,我使用了此库com.akexorcist:localizationactivity

if(currentLanguage.country.toLowerCase() == "arabic"){
        etPassword.gravity = GravityCompat.END
}else{
        etPassword.gravity = GravityCompat.START
}

答案 6 :(得分:0)

这是我的type = password的editText解决方案(解决方法)。在Android 5,Android 6上运行。

edittext_password = (EditText) rootView.findViewById(R.id.edittext_password);
            if (RTLUtils.isLeftToRightLanguage()) {
                edittext_password.setGravity(Gravity.START);
            } else {
                // Force a right-aligned text entry, otherwise latin character input,
                // like "abc123", will jump to the left and may even disappear!
                edittext_password.setTextDirection(View.TEXT_DIRECTION_RTL);
                // Make the hint display on the right hand side
                edittext_password.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
            }
            edittext_password.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                    isLeftToRight = RTLUtils.isLeftToRightLanguage(charSequence.toString());
                }

                @Override
                public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                }

                @Override
                public void afterTextChanged(Editable editable) {
                    if (editable.length() > 0) {
                        isLeftToRight = RTLUtils.isLeftToRightLanguage(editable.toString());
                        if (isLeftToRight) {
                            edittext_password.setGravity(Gravity.START);
                            edittext_password.setTextDirection(View.TEXT_DIRECTION_LTR);
                            edittext_password.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
                            // Move the cursor to the correct place (after the typed character)
                            edittext_password.setSelection(editable.length());
                        } else {
                            //edittext_password.setGravity(Gravity.END);
                            edittext_password.setTextDirection(View.TEXT_DIRECTION_RTL);
                            // When a character is typed, dynamically change the EditText's
                            // InputType to PASSWORD, to show the dots and conceal the typed characters.
                            edittext_password.setInputType(InputType.TYPE_CLASS_TEXT |
                                    InputType.TYPE_TEXT_VARIATION_PASSWORD |
                                    InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
                            // Move the cursor to the correct place (after the typed character)
                            edittext_password.setSelection(editable.length());
                        }
                    } else { // empty text
                        if (!RTLUtils.isLeftToRightLanguage()) {
                            // Must be in this order (first setInputType then setTextDirection)
                            edittext_password.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
                            edittext_password.setTextDirection(View.TEXT_DIRECTION_RTL);
                        }
                    }
                }
            });

  public static boolean isLeftToRightLanguage() {
        Bidi bidi = new Bidi(Locale.getDefault().getDisplayLanguage(), Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT);
        if (bidi.isLeftToRight()) {
            return true;
        } else {
            return false;
        }
    }

    public static boolean isLeftToRightLanguage(String text) {
        Bidi bidi = new Bidi(text, Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT);
        if (bidi.isLeftToRight()) {
            return true;
        } else {
            return false;
        }
    }

结果如下:(阿拉伯软键盘)

enter image description here

和英语软键盘:

enter image description here

答案 7 :(得分:0)

这个对我来说很好

android:textAlignment =“ viewStart”

提示方向将在正确的一侧