如何使用EditTextPreference作为屏蔽密码文本字段?

时间:2011-05-28 21:24:36

标签: android textview android-preferences

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

我该怎么做?

5 个答案:

答案 0 :(得分:114)

以下是使用xml的简短示例:

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

或者您可以使用numberPassword代替textPassword

答案 1 :(得分:4)

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

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

这给了我一个带有虚线textdisplay和数字键盘的EditTextPreference用于输入。

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

对于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

答案 4 :(得分:0)

您可以使用以下代码进行操作。但是,我仍然没有弄清楚如何执行PASSWORD_TOGGLE这件事。仅仅定义 app:endIconMode =“ password_toggle” 不能起作用吗?

答案:“ EditTextPreference”字段“ db_pwd”具有以下定义:

android:inputType="textPassword"

最新的Kotlin版本代码:

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