EditTextPreference inputType=textPassword 不工作
EditTextPreference inputType=textPassword not working
我已经使用模板创建了一个 SettingsActivity,并在我的 root_preferences.xml 中放置了一个 EditTextPreference。它应该包含一个密码,所以我这样编辑它:
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@color/colorBackground">
<EditTextPreference
android:id="@+id/etPassword"
android:dialogTitle="Passwort"
android:inputType="textPassword"
android:key="pref_password"
android:selectAllOnFocus="true"
android:singleLine="true"
android:title="Passwort" />
我的问题是 inputType、singleLine 和 setAllOnFocus 都不起作用。你知道问题出在哪里吗?
您无法从 XML 执行此操作,但 EditTextpreference 会公开 EditText,因此您可以通过编程方式执行此操作。在 Activity/Fragment 中加载首选项后,您可以:
EditTextPreference pref = (EditTextPreference)
PreferenceManager.findPreference("edit");
EditText prefEditText = pref.getEditText();
prefEditText.setInputType(InputType.TYPE_CLASS_TEXT); // set properties here
prefEditText.setSingleLine(true);
就我而言,InputType 不会在输入时和摘要中隐藏密码。
这是我解决问题的方法
XML 文件
<PreferenceScreen
xmlns:app="http://schemas.android.com/apk/res-auto">
<EditTextPreference
app:key="pref_password"
app:title="Password"
app:dialogTitle="Set password"
app:useSimpleSummaryProvider="true"
/>
</PreferenceScreen>
在你的 XML 中的 PreferenceFragmentCompat
中,在 onCreatePreferences
部分找到你的 EditTextPreference
并在其上添加一个 OnBindEditTextListener
。
public static class YourFragment extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
// Find the password EditText
EditTextPreference etpPassword = getPreferenceManager().findPreference("pref_password");
etpPassword.setOnBindEditTextListener(new EditTextPreference.OnBindEditTextListener() {
@Override
public void onBindEditText(@NonNull EditText editText) {
// Set keyboard layout and some behaviours of the field
editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
// Replace -> android:singleLine="true"
// Not needed for password field, or set it before setTransformationMethod
// otherwise the password will not be hidden
//editText.setSingleLine(true);
// Replace -> android:inputType="textPassword"
// For hiding text
editText.setTransformationMethod(PasswordTransformationMethod.getInstance());
// Replace -> android:selectAllOnFocus="true"
// On password field, you cannot make a partial selection with .setSelection(start, stop)
editText.selectAll();
// Replace -> android:maxLength="99"
editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(99)});
}
});
}
}
您也可以创建自己的 EditTextPreference
class 并设置其他内容。
public class YourEditTextPreference extends EditTextPreference {
// Add some preferences, which can be used later for checking
private Integer mPasswordMinSize = 6;
public EditTextPreferencePassword(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init();
}
public EditTextPreferencePassword(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
public EditTextPreferencePassword(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public EditTextPreferencePassword(Context context) {
super(context);
init();
}
private void init(){
// Set Dialog button text
this.setNegativeButtonText("RETURN");
this.setPositiveButtonText("CHECK");
this.setOnBindEditTextListener(new OnBindEditTextListener() {
@Override
public void onBindEditText(@NonNull EditText editText) {
// Put field parameters here
}
});
}
public void setMinSize(int minSize) { mPasswordMinSize = minSize; }
public Integer getMinSize(){ return mPasswordMinSize; }
// Hide password by stars
@Override
public CharSequence getSummary() {
return getText().equals("") ? super.getSummary() : "*******";
}
}
然后在您的 XML 中,将 <EditTextPreference
更改为 <complet.path.to.YourEditTextPreference
正如在之前的回答中所指出的,EditTextPreference 无法理解 inputType,并且它似乎无法像人们期望的那样将其本身传递给底层的 EditText 对象。
雪上加霜的是,根据您使用的库,似乎缺乏一致性。接受的答案似乎不适用于 AndroidX,因为在 EditTextPreference 实现中没有这样的 getEditText() 方法。不过,有一种方法可以添加一个专门用于此目的的侦听器(Kotlin 示例):
val myPref = findPreference<EditTextPreference>(
"my_pref_key"
)
myPref?.setOnBindEditTextListener {
it.inputType = InputType.TYPE_CLASS_NUMBER
}
终于成功了,但我浪费了一个好小时试图找出解决方案,主要是阅读有关此事的过时问题和答案。
我看到已经有一段时间了,但是在 SettingsFragment onViewCreated() 中设置这个对我有用...
val pw = preferenceScreen.preferenceManager.findPreference<EditTextPreference>("password")
pw?.setOnBindEditTextListener {
it.inputType = InputType.TYPE_CLASS_TEXT + InputType.TYPE_TEXT_VARIATION_PASSWORD
}
我已经使用模板创建了一个 SettingsActivity,并在我的 root_preferences.xml 中放置了一个 EditTextPreference。它应该包含一个密码,所以我这样编辑它:
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@color/colorBackground">
<EditTextPreference
android:id="@+id/etPassword"
android:dialogTitle="Passwort"
android:inputType="textPassword"
android:key="pref_password"
android:selectAllOnFocus="true"
android:singleLine="true"
android:title="Passwort" />
我的问题是 inputType、singleLine 和 setAllOnFocus 都不起作用。你知道问题出在哪里吗?
您无法从 XML 执行此操作,但 EditTextpreference 会公开 EditText,因此您可以通过编程方式执行此操作。在 Activity/Fragment 中加载首选项后,您可以:
EditTextPreference pref = (EditTextPreference)
PreferenceManager.findPreference("edit");
EditText prefEditText = pref.getEditText();
prefEditText.setInputType(InputType.TYPE_CLASS_TEXT); // set properties here
prefEditText.setSingleLine(true);
就我而言,InputType 不会在输入时和摘要中隐藏密码。 这是我解决问题的方法
XML 文件
<PreferenceScreen
xmlns:app="http://schemas.android.com/apk/res-auto">
<EditTextPreference
app:key="pref_password"
app:title="Password"
app:dialogTitle="Set password"
app:useSimpleSummaryProvider="true"
/>
</PreferenceScreen>
在你的 XML 中的 PreferenceFragmentCompat
中,在 onCreatePreferences
部分找到你的 EditTextPreference
并在其上添加一个 OnBindEditTextListener
。
public static class YourFragment extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
// Find the password EditText
EditTextPreference etpPassword = getPreferenceManager().findPreference("pref_password");
etpPassword.setOnBindEditTextListener(new EditTextPreference.OnBindEditTextListener() {
@Override
public void onBindEditText(@NonNull EditText editText) {
// Set keyboard layout and some behaviours of the field
editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
// Replace -> android:singleLine="true"
// Not needed for password field, or set it before setTransformationMethod
// otherwise the password will not be hidden
//editText.setSingleLine(true);
// Replace -> android:inputType="textPassword"
// For hiding text
editText.setTransformationMethod(PasswordTransformationMethod.getInstance());
// Replace -> android:selectAllOnFocus="true"
// On password field, you cannot make a partial selection with .setSelection(start, stop)
editText.selectAll();
// Replace -> android:maxLength="99"
editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(99)});
}
});
}
}
您也可以创建自己的 EditTextPreference
class 并设置其他内容。
public class YourEditTextPreference extends EditTextPreference {
// Add some preferences, which can be used later for checking
private Integer mPasswordMinSize = 6;
public EditTextPreferencePassword(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init();
}
public EditTextPreferencePassword(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
public EditTextPreferencePassword(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public EditTextPreferencePassword(Context context) {
super(context);
init();
}
private void init(){
// Set Dialog button text
this.setNegativeButtonText("RETURN");
this.setPositiveButtonText("CHECK");
this.setOnBindEditTextListener(new OnBindEditTextListener() {
@Override
public void onBindEditText(@NonNull EditText editText) {
// Put field parameters here
}
});
}
public void setMinSize(int minSize) { mPasswordMinSize = minSize; }
public Integer getMinSize(){ return mPasswordMinSize; }
// Hide password by stars
@Override
public CharSequence getSummary() {
return getText().equals("") ? super.getSummary() : "*******";
}
}
然后在您的 XML 中,将 <EditTextPreference
更改为 <complet.path.to.YourEditTextPreference
正如在之前的回答中所指出的,EditTextPreference 无法理解 inputType,并且它似乎无法像人们期望的那样将其本身传递给底层的 EditText 对象。
雪上加霜的是,根据您使用的库,似乎缺乏一致性。接受的答案似乎不适用于 AndroidX,因为在 EditTextPreference 实现中没有这样的 getEditText() 方法。不过,有一种方法可以添加一个专门用于此目的的侦听器(Kotlin 示例):
val myPref = findPreference<EditTextPreference>(
"my_pref_key"
)
myPref?.setOnBindEditTextListener {
it.inputType = InputType.TYPE_CLASS_NUMBER
}
终于成功了,但我浪费了一个好小时试图找出解决方案,主要是阅读有关此事的过时问题和答案。
我看到已经有一段时间了,但是在 SettingsFragment onViewCreated() 中设置这个对我有用...
val pw = preferenceScreen.preferenceManager.findPreference<EditTextPreference>("password")
pw?.setOnBindEditTextListener {
it.inputType = InputType.TYPE_CLASS_TEXT + InputType.TYPE_TEXT_VARIATION_PASSWORD
}