【发布时间】:2011-05-28 21:24:36
【问题描述】:
我有一个非常简单的问题:
我有一个EditTextPreference 对话框,我想用它来获取用户的密码,并且我希望它被屏蔽。
我该怎么做?
【问题讨论】:
标签: android textview android-preferences
我有一个非常简单的问题:
我有一个EditTextPreference 对话框,我想用它来获取用户的密码,并且我希望它被屏蔽。
我该怎么做?
【问题讨论】:
标签: android textview android-preferences
这是一个使用 xml 的简短示例:
<EditTextPreference
android:key="@string/key"
android:title="@string/title"
android:summary="@string/summary"
android:inputType="textPassword" />
或者您可以使用numberPassword 代替textPassword。
【讨论】:
Preference,使用自定义对话框扩展DialogPreference。
对于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
【讨论】:
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。
【讨论】:
您可以使用下面的代码来完成。但是,我仍然没有弄清楚如何做 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() }
}
【讨论】:
对于AndroidX Preferences,执行:
password.setOnBindEditTextListener(editText -> {
editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
});
inputType XML 属性未用于androidx。
【讨论】:
如果您希望密码掩码在设备轮换后仍然存在,添加以下imeOption:
在编辑文本布局中
android:imeOptions="flagNoExtractUi"
或以编程方式
yourEditText.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI);
【讨论】:
EditTextPreference访问编辑文本布局?