【问题标题】:How to use EditTextPreference as a masked Password text field?如何使用 EditTextPreference 作为屏蔽的密码文本字段?
【发布时间】:2011-05-28 21:24:36
【问题描述】:

我有一个非常简单的问题:
我有一个EditTextPreference 对话框,我想用它来获取用户的密码,并且我希望它被屏蔽。

我该怎么做?

【问题讨论】:

    标签: android textview android-preferences


    【解决方案1】:

    这是一个使用 xml 的简短示例:

    <EditTextPreference
        android:key="@string/key"
        android:title="@string/title"
        android:summary="@string/summary"   
        android:inputType="textPassword" />
    

    或者您可以使用numberPassword 代替textPassword

    【讨论】:

    • 太棒了!我知道它应该很简单,但我没想到它会那么简单......
    • 我需要一个类似的选项,但在我的对话框首选项中,我需要 3 个编辑文本而不是单个编辑文本。一个用于旧密码、新密码和确认密码。你能给我一个如何做到这一点的样本吗? Tha android 示例 apidemo 在对话框中只有一个编辑文本首选项。我不知道如何将其更改为适合 3 在同一个对话框中。
    • 您应该创建自定义Preference,使用自定义对话框扩展DialogPreference
    • 谢谢!很高兴这很容易做到。
    • 但是当方向更改为横向时,编辑文本会全屏显示并且密码不会显示为隐藏:(
    【解决方案2】:

    对于androidx 库,您应该以编程方式进行操作,例如您可以按如下方式进行操作,或者我根据密码长度设置带有星号的摘要:

    [...]
    import android.os.Bundle;
    import android.text.InputType;
    import android.widget.EditText;
    
    import androidx.annotation.NonNull;
    
    import androidx.preference.EditTextPreference;
    import androidx.preference.Preference;
    import androidx.preference.PreferenceFragmentCompat;
    import androidx.preference.PreferenceManager;
    
    import static androidx.preference.EditTextPreference.*;
    
    public class MySettingsFragment extends PreferenceFragmentCompat {
        @Override
        public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
            setPreferencesFromResource(R.xml.preferences, rootKey);
    
            final EditTextPreference preference = findPreference("password");
    
            if (preference != null) {
                preference.setSummaryProvider(new SummaryProvider() {
                    @Override
                    public CharSequence provideSummary(Preference preference) {
    
                        String getPassword = PreferenceManager.getDefaultSharedPreferences(getContext()).getString("password", "not set");
    
                        //we assume getPassword is not null
                        assert getPassword != null;
    
                        //return "not set" else return password with asterisks
                        if (getPassword.equals("not set")) {
                            return getPassword;
                        } else {
                            return (setAsterisks(getPassword.length()));
                        }
                    }
                });
    
                //set input type as password and set summary with asterisks the new password
                preference.setOnBindEditTextListener(
                        new OnBindEditTextListener() {
                            @Override
                            public void onBindEditText(@NonNull final EditText editText) {
                                editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
                                preference.setSummaryProvider(new SummaryProvider() {
                                    @Override
                                    public CharSequence provideSummary(Preference preference) {
                                        return setAsterisks(editText.getText().toString().length());
                                    }
                                });
                            }
                        });
            }
        }
    
        //return the password in asterisks
        private String setAsterisks(int length) {
            StringBuilder sb = new StringBuilder();
            for (int s = 0; s < length; s++) {
                sb.append("*");
            }
            return sb.toString();
        }
    }
    

    在 xml 你应该有类似的东西:

    <EditTextPreference
        android:dialogMessage="Enter your password"
        android:dialogTitle="Password"
        android:key="password"
        android:title="Password" />
    

    更多信息请关注developer.android

    【讨论】:

    【解决方案3】:

    android:inputType="numberPassword" 不适合我。 Eclipse 告诉我,该属性不允许使用 String 值。 所以我使用了以下内容:

    <EditTextPreference
        android:key="@string/key"
        android:title="@string/title"
        android:summary="@string/summary"   
        android:inputType="number"
        android:password="true" />
    

    这给了我一个带有点文本显示和数字键盘输入的 EditTextPreference。

    【讨论】:

      【解决方案4】:

      您可以使用下面的代码来完成。但是,我仍然没有弄清楚如何做 PASSWORD_TOGGLE 的事情。仅定义 app:endIconMode="password_toggle" 不起作用,有人可以帮忙吗?

      答案:“EditTextPreference”字段“db_pwd”定义如下:

      android:inputType="textPassword"
      

      最新的 Kotlin rev 代​​码:

      class SettingsFragment : PreferenceFragmentCompat() {
      override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
          setPreferencesFromResource(com.unified.helloworld.R.xml.my_preferences, rootKey)
          val pwdPref =
              findPreference<EditTextPreference>("db_pwd")
          if (pwdPref != null) {
              pwdPref.summaryProvider = SummaryProvider<Preference?> {
                  val getPassword: String =
                      PreferenceManager.getDefaultSharedPreferences(context)
                          .getString("db_pwd", "Not set")!!
      
                  // Return "Not set" else return password with asterisks
                  if (getPassword == "Not set") {
                      getPassword } else { setAsterisks(getPassword.length) }
              }
      
              // Set type as password and set summary with asterisks
              pwdPref.setOnBindEditTextListener(
                  OnBindEditTextListener { editText ->
                      editText.inputType =
                          InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
                      pwdPref.summaryProvider = SummaryProvider<Preference> { setAsterisks(editText.text.toString().length) }
                  })
          }
      }
      
      // Return the password in asterisks
      private fun setAsterisks(length: Int): String {
          val sb = java.lang.StringBuilder()
          for (s in 0 until length) {
              sb.append("*") }
          return sb.toString() }
      }
      

      【讨论】:

        【解决方案5】:

        对于AndroidX Preferences,执行:

        password.setOnBindEditTextListener(editText -> {
            editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
        });
        

        inputType XML 属性未用于androidx

        【讨论】:

        【解决方案6】:

        如果您希望密码掩码在设备轮换后仍然存在,添加以下imeOption

        在编辑文本布局中 android:imeOptions="flagNoExtractUi"

        或以编程方式 yourEditText.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI);

        【讨论】:

        • 如何从EditTextPreference访问编辑文本布局?
        • 查看 EditTextPreference 文档:link
        • 无法解析“EditTextPreference”中的“setImeOptions”方法!
        猜你喜欢
        • 2014-02-05
        • 1970-01-01
        • 1970-01-01
        • 2020-06-12
        • 2012-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-03
        相关资源
        最近更新 更多