我们如何在 EditTextPreference 中使用 android:inputType?

How can we use android:inputType in EditTextPreference?

我查看了EditTextPreference的文档 http://developer.android.com/reference/android/preference/EditTextPreference.html

但是我在那里找不到 android:inputType 属性。那么这个代码段怎么用

<EditTextPreference
        android:key="edit"
        android:title="@string/location1"
        android:summary="@string/summary1"
        android:dialogTitle="@string/location1"
        android:dialogMessage="@string/message"
        android:inputType="text"
        android:singleLine="true"
        />

同样对android:singleLine属性有疑问。

您无法从 XML 执行此操作,但可以通过 EditTextpreference exposes the EditText 以编程方式执行此操作。在 Activity/Fragment 中加载首选项后,您可以:

EditTextPreference pref = (EditTextPreference) PreferenceManager.findPreference("edit");
EditText prefEditText = pref.getEditText();
prefEditText.setInputType(InputType.TYPE_CLASS_TEXT);
prefEditText.setSingleLine(true);
// etc

文档没有列出 class 的属性,但 InputType 属性(以及其他 EditTextTextView 属性)仍然有效。仅在文中说明。另见 this related question.

EditTextPreference documentation 没有明确列出它支持的所有属性,但文本指出:

See EditText Attributes.

那里的 link 不是很有用(他们可能重新组织了一些属性,但从未更新过一些 link),但这里有一个直接 link 到 inputType values。作为快速总结,这些值是(截至发布时):

  • none
  • 文字
  • textCapCharacters
  • textCapWords
  • textCapSentences
  • 文本自动更正
  • 文本自动完成
  • 文本多行
  • textImeMultiLine
  • textNoSuggestions
  • textUri
  • 文本电子邮件地址
  • textEmailSubject
  • textShortMessage
  • textLongMessage
  • 文本人物姓名
  • 文本邮政地址
  • 文本密码
  • textVisiblePassword
  • textWebEditText
  • 文本过滤器
  • 文本语音
  • textWebEmailAddress
  • 文本网络密码
  • 人数
  • 签名数
  • 十进制数
  • 数字密码
  • phone
  • 日期时间
  • 日期
  • 时间

你显然可以使用其中的一个或多个,用 | 分隔(虽然我从来没有这样做过)。

您可以找到问题的答案here

基本上,您需要导入androidX库并按照我的代码进行操作。

使用AndroidX,设置输入类型为密码,例如:

root_preferences.xml:

<androidx.preference.PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <Preference
        android:title="Password"
        android:key="my_pref_password"/>
</androidx.preference.PreferenceScreen>

在您的设置片段中:

@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
    setPreferencesFromResource(R.xml.root_preferences, rootKey);


    EditTextPreference pref = findPreference("my_pref_password");
    pref.setOnBindEditTextListener(new EditTextPreference.OnBindEditTextListener() {
        @Override
        public void onBindEditText(@NonNull EditText editText) {
            editText.setInputType(InputType.TYPE_CLASS_TEXT |
                            InputType.TYPE_TEXT_VARIATION_PASSWORD);
        }
    });
}

#最简单且经过测试的答案#

对于 EditTextPreference 中的仅十进制值

onCreatePreferences

中写入这段代码

确保同时使用CLASS属性 class

示例

InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL

public static class SettingsFragment extends PreferenceFragmentCompat {
    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        setPreferencesFromResource(R.xml.root_preferences, rootKey);

        EditTextPreference new_bonus= findPreference("new_bonus");
        EditTextPreference old_bonus= findPreference("old_bonus");


        EditTextPreference.OnBindEditTextListener onBindEditTextListener = new EditTextPreference.OnBindEditTextListener() {
            @Override
            public void onBindEditText(@NonNull EditText editText) {
                editText.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);
            }
        };

        old_bonus.setOnBindEditTextListener(onBindEditTextListener);
        new_bonus.setOnBindEditTextListener(onBindEditTextListener);

    }
}