提示与密码 EditText 右侧对齐

2023-11-21

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

Java

    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"/>

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

不过,有一种方法可以解决这个问题:

  • 要使提示正确显示在右侧(从右到左/RTL 模式),您必须remove输入类型属性textPassword (InputType.TYPE_TEXT_VARIATION_PASSWORD),当没有输入文本时。

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

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

详细信息如下:

您的先决条件AndroidManifest.xml:

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

您的 XML 布局包含:

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

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

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.login_fragment_layout, container, false);
    final EditText password = (EditText) view.findViewById(R.id.password);

    // Workaround https://issuetracker.google.com/issues/37082815 for Android 4.4+
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && isRTL(getActivity())) {

        // Force a right-aligned text entry, otherwise latin character input,
        // like "abc123", will jump to the left and may even disappear!
        password.setTextDirection(View.TEXT_DIRECTION_RTL);

        // Make the "Enter password" hint display on the right hand side
        password.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
    }

    password.addTextChangedListener(new TextWatcher() {

        boolean inputTypeChanged;

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {}

        @Override
        public void afterTextChanged(Editable s) {

            // Workaround https://code.google.com/p/android/issues/detail?id=201471 for Android 4.4+
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && isRTL(getActivity())) {
                if (s.length() > 0) {
                    if (!inputTypeChanged) {

                        // When a character is typed, dynamically change the EditText's
                        // InputType to PASSWORD, to show the dots and conceal the typed characters.
                        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)
                        password.setSelection(s.length());

                        inputTypeChanged = true;
                    }
                } else {
                    // Reset EditText: Make the "Enter password" hint display on the right
                    password.setInputType(InputType.TYPE_CLASS_TEXT |
                            InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);

                    inputTypeChanged = false;
                }
            }
        }
    });

    return view;
}

public static boolean isRTL(Context context) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        return context.getResources().getConfiguration().getLayoutDirection()
                == View.LAYOUT_DIRECTION_RTL;
        // Another way:
        // Define a boolean resource as "true" in res/values-ldrtl
        // and "false" in res/values
        // return context.getResources().getBoolean(R.bool.is_right_to_left);
    } else {
        return false;
    }
}

它应该像这样工作:

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

提示与密码 EditText 右侧对齐 的相关文章

随机推荐

  • Android Studio - 设备文件资源管理器停止工作

    几天来 Android Studio 的设备文件资源管理器向我显示了以下消息 执行 shell 命令 pm list 包时出错 并且无法从数据文件夹中查看文件和应用程序 例如从我的 Flutter 应用程序获取数据库 有什么想法可以解决这个
  • Javascript Jupyter Notebook 如何获取代码单元格内容?

    有一个类似的问题here 但它是关于使用 python 代码读取 markdown 单元格 我想使用 JavaScript 例如在 Jupyter Notebook 前端扩展中 来读取代码单元中的源代码 我想对代码进行分析 然而 如果我只是
  • Android Activity 过渡动画

    我想要实现的是 使用现有活动的过渡动画启动一个新活动only 我想向上滑动当前活动 新活动将位于当前活动的后面 这是向上滑动的动画 R layout slide up
  • 获取两个 javascript 对象的增量

    我有两个大型的嵌套 JavaScript 对象 我想比较它们并创建一个仅代表差异的对象 我打算用它来创建 PATCH 请求 Given oldObj and newObj 仅在的属性newObj应该在差异中 仅在的属性oldObj应该在差异
  • 使用 pysmbc 通过 samba 读取文件

    我正在 Ubuntu 上使用 python smbc 库来访问 samba 共享 我可以很好地访问目录结构 但我不确定如何访问实际文件及其内容 网页 https fedorahosted org pysmbc 没有提到任何东西 代码是用C
  • PHP (Apache) 默默地将 HTTP 429 和其他转换为 500

    我刚刚在 PHP 的 header 方法中发现了一个奇怪的现象 它会默默地将我的一些状态转换为 500 由于我没有运气在各种网络搜索中找到提及此行为的信息 因此我将其添加到此处 希望能够避免其他人的烦恼 而且还要询问是否有人发现了比我想出的
  • Android 应用程序中的 WebView 内存泄漏

    我正在使用带有 webview 的布局 每次我在 web 视图中加载页面时 我都会在任务管理器中注意到内存泄漏 似乎我的 webview 保留在内存中所有页面的数据 我怎样才能避免这种行为 None
  • window.onbeforeunload 可能会触发多次

    仅仅因为您看不到某个功能的用途并不意味着它没有用 Stack Exchange 网络 GMail Grooveshark Yahoo Mail 和 Hotmail 使用 onbeforeunload 提示来防止 警告用户在开始编辑某些内容后
  • 如何将字符串解析为 float 或 int?

    我怎样才能转换str to float 545 2222 545 2222 我怎样才能转换str to int 31 31 For the reverse see Convert integer to string in Python an
  • Objective-C 中的 super 到底是什么?

    据我所知 它是指向超类的指针 它与超类是硬连线的 并且不是在运行时动态计算出来的 想更详细的了解一下 Anyone super 本质上 它允许您使用当前类的超类的实现 For the gritty detailsObjective C 运行
  • 当我仅使用脚本名称在 Windows 上运行 Python 脚本时无法重定向输出

    它在 Windows 7 64 位 带有 Win32 Python 扩展的 Python 2 6 上运行 我有一个简单的脚本 只打印 hello world 我可以启动它python hello py 在这种情况下 我可以将输出重定向到文件
  • 如何用C语言函数判断一个文件是否是elf文件?

    在我的程序中 我想识别文件是否是ELF 可执行和可链接格式 类型 如何用C语言函数判断一个文件是否是elf文件 If the only你要做的就是测试文件是否是 ELF 然后读取前 16 个字节来检查文件身份 前四个字节等于 0x7f E
  • 为什么我无法使用 LWP::Simple 获取维基百科页面?

    我正在尝试使用获取维基百科页面LWP 简单 但他们不会回来了 这段代码 usr bin perl use strict use LWP Simple print get http en wikipedia org wiki Stack ov
  • Python dict.get() 引发 KeyError

    我在这里迷路了 Python 2 7 我有一本字典mt 我用get 方法 文档中说 get key default 如果 key 位于则返回 key 的值 字典 否则默认 如果没有给出默认值 则默认为 无 因此该方法永远不会引发KeyErr
  • AngularJS:观察高度变化的更好方法

    我遇到了旧的可变高度导航问题 Aposition fixes顶部导航和内容margin top naviHeight以下 当数据异步加载时 导航可以改变高度 因此内容的边距也必须随之改变 我希望这是独立的 因此 没有加载数据的代码 而仅在涉
  • 如果锁定的对象内部发生异常,该对象是否会保持锁定状态?

    在 C 线程应用程序中 如果我要锁定一个对象 比如说队列 如果发生异常 该对象是否会保持锁定状态 这是伪代码 int ii lock MyQueue MyClass LclClass MyClass MyQueue Dequeue try
  • 使用 OpenSSL 读取证书文件时出现 Ruby 错误

    我正在尝试做一个简单的OpenSSL X509 Certificate new File read testuser p12 来自IRB与红宝石 1 8 7 或 1 9 2 两者结果相同 我得到的错误是OpenSSL X509 Certif
  • 使用包含空格的文件名的 GNUMake 最可靠的方法是什么?

    我想使用 GNUMake 运行基于规则的 makefile 该文件在目录结构中 在 Windows 文件系统上 构建一组 C 文件 根目录 部分子目录和部分文件包含空格 示例文件 C Documents and Settings
  • 命名和未命名匿名 Javascript 函数之间的差异

    通常 在 Javascript 中 当我想将匿名 内联函数作为参数传递给另一个函数时 我会执行以下操作之一 someFunctionCall function someFunctionCall gt 然而 我最近继承了一个使用的代码库nam
  • 提示与密码 EditText 右侧对齐

    我正在研究阿拉伯语并开展活动 我希望用户名和密码的提示从右侧开始 并且从左侧开始输入没有问题 但在我的用户界面中 我希望提示位于右侧 但是当我为 EditText 添加 inputType 时 提示会移到左侧 我尝试以编程方式解决它 但它不