<android.support.v7.preference.EditTextPreference
android:key="prefTest"
android:title="test number input"
android:inputType="numberDecimal|numberSigned"
android:defaultValue="800"/>
Он по-прежнему показывает обычную клавиатуру и позволяет мне набирать любой символ
Что-то не так с android.support.v7
?
android:digits="0123456789"
используйте это в edittext, поскольку он принимает только определенные числа. если он не работает, используйте Android-Support-Preference-V7-Fix.
Исправлено редактирование EditTextPreference пересылает атрибуты XML (например, inputType) в EditText, как и исходное предпочтение.
support v7 preference
действительно плохое, я думаю
android.support.v7.preference.EditTextPreference
не содержит getEditText()
.
Но мы можем расширить android.support.v7.preference.EditTextPreferenceDialogFragmentCompat
чтобы установить inputType.
public class EditTextPreferenceDialogFragmentCompat extends android.support.v7.preference.EditTextPreferenceDialogFragmentCompat {
private EditText mEditText;
private int mInputType;
public static EditTextPreferenceDialogFragmentCompat newInstance(String key, int inputType) {
EditTextPreferenceDialogFragmentCompat fragment = new EditTextPreferenceDialogFragmentCompat();
Bundle b = new Bundle(2);
b.putString("key", key);
b.putInt("inputType", inputType);
fragment.setArguments(b);
return fragment;
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mInputType = this.getArguments().getInt("inputType");
}
protected void onBindDialogView(View view) {
this.mEditText = view.findViewById(android.R.id.edit);
mEditText.setInputType(mInputType);
super.onBindDialogView(view);
}
}
Затем сделайте вашу деятельность реализующей PreferenceFragmentCompat.OnPreferenceDisplayDialogCallback
Используйте свой EditTextPreferenceDialogFragmentCompat
вместо android.support.v7.preference.EditTextPreferenceDialogFragmentCompat
public boolean onPreferenceDisplayDialog(@NonNull PreferenceFragmentCompat preferenceFragmentCompat, Preference preference) {
String key = preference.getKey();
if (/**show your dialog*/) {
EditTextPreferenceDialogFragmentCompat f = EditTextPreferenceDialogFragmentCompat.newInstance(preference.getKey(), InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED);
f.setTargetFragment(this, 0);
f.show(getFragmentManager(), "android.support.v14.preference.PreferenceFragment.DIALOG");
return true;
}
return false;
}
просто используйте android.support.v7.preference.EditTextPreference
в xml
<android.support.v7.preference.PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<android.support.v7.preference.EditTextPreference
.../>
</android.support.v7.preference.PreferenceScreen>
Думаю, я бы добавил свое решение для Android-TV на случай, если кто-то попадет сюда и понадобится. Ответ android_su направил меня в правильном направлении, к сожалению, LeanbackEditTextPreferenceDialogFragmentCompat
не поддерживает OnPreferenceDisplayDialogCallback
. Вместо этого я должен был:
Переопределите onCreateView
и реализуйте новую функцию newInstance
для LeanbackEditTextPreferenceDialogFragmentCompat
используя наследование:
public static class TvPreferencesDialog extends LeanbackEditTextPreferenceDialogFragmentCompat {
public static TvPreferencesDialog newInstance(String key) {
final Bundle args = new Bundle(1);
args.putString(ARG_KEY, key);
final TvPreferencesDialog fragment = new TvPreferencesDialog();
fragment.setArguments(args);
return fragment;
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View root = super.onCreateView(inflater, container, savedInstanceState);
final String key = getArguments().getString(ARG_KEY);
EditText editTextView = root.findViewById(android.R.id.edit);
if (key.equalsIgnoreCase("some pref key 1")) {
editTextView.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL);
} else if (key.equalsIgnoreCase("some pref key 2")) {
editTextView.setInputType(InputType.TYPE_CLASS_NUMBER);
editTextView.addTextChangedListener(new MyTextWatcher());
}
return root;
}
}
переопределить onPreferenceDisplayDialog
внутри моего LeanbackSettingsFragmentCompat
:
@Override
public boolean onPreferenceDisplayDialog(@NonNull PreferenceFragmentCompat caller, Preference pref) {
if (caller == null) {
throw new IllegalArgumentException("Cannot display dialog for preference " + pref + ", Caller must not be null!");
}
final Fragment f;
if (pref instanceof EditTextPreference) {
f = TvPreferencesDialog.newInstance(pref.getKey());
f.setTargetFragment(caller, 0);
startPreferenceFragment(f);
return true;
} else {
return super.onPreferenceDisplayDialog(caller, pref);
}
}
Это происходит при использовании android.support.v14.preference.PreferenceFragment или android.support.v7.preference.PreferenceFragmentCompat даже после выбора android:inputType="numberDecimal"
. Эта проблема может быть преодолена с помощью android.preference.PreferenceFragment. К сожалению, это устарело на уровне API 28.
Даже рефакторинг в AndroidX с использованием androidx.preference.PreferenceFragment или androidx.preference.PreferenceFragmentCompat не устранил проблему.
Я согласен с тем, что исходные параметры поддержки имеют некоторые проблемы, но для решения этой проблемы нам просто нужно добавить пользовательский макет и указать EditText с помощью android: inputType = "number"
<android.support.v7.preference.EditTextPreference
android:dialogLayout="@layout/preference_dialog_edittext_custom"
Чтобы вы могли скопировать исходный файл preference_dialog_layout.xml и отредактировать его.
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="48dp"
android:layout_marginBottom="48dp"
android:overScrollMode="ifContentScrolls">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:layout_marginEnd="24dp"
android:orientation="vertical">
<TextView android:id="@android:id/message"
style="?android:attr/textAppearanceSmall"
android:layout_marginBottom="48dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="?android:attr/textColorSecondary" />
<EditText
android:id="@android:id/edit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="number"
android:layout_marginStart="-4dp"
android:layout_marginEnd="-4dp" />
</LinearLayout>
</ScrollView>
Вы можете получить EditText из Preference и оттуда setInputTypes или использовать KeyListeners, чтобы сообщить клавиатуре:
EditText et = (EditText) editTextPref.getEditText();
et.setKeyListener(DigitsKeyListener.getInstance());
EditTextPreference
android.support.v7.preference
больше не имеет этого метода :-(
Эй, попробуйте Это, чтобы вывести клавиатуру только с номерами
android:inputType="phone"
Виджеты EditTextPreference должны иметь те же атрибуты, что и обычный EditText, поэтому используйте:
android:inputType="number"