EditTextPreference - только числовое значение inputType - не работает

2
<android.support.v7.preference.EditTextPreference
            android:key="prefTest"
            android:title="test number input"
            android:inputType="numberDecimal|numberSigned"
            android:defaultValue="800"/>

Он по-прежнему показывает обычную клавиатуру и позволяет мне набирать любой символ

Что-то не так с android.support.v7?

  • 0
    Попробуй android: inputType = "number"
  • 0
    @chirag90 chirag90 ничего не изменило
Показать ещё 2 комментария
Теги:
android-support-library

8 ответов

5
Лучший ответ
android:digits="0123456789"

используйте это в edittext, поскольку он принимает только определенные числа. если он не работает, используйте Android-Support-Preference-V7-Fix.

Исправлено редактирование EditTextPreference пересылает атрибуты XML (например, inputType) в EditText, как и исходное предпочтение.

  • 0
    не помогло, support v7 preference действительно плохое, я думаю
  • 0
    тогда вы должны пойти вторым методом, как я предложил в моем комментарии.
Показать ещё 1 комментарий
1

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>
0

Думаю, я бы добавил свое решение для 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);
    }
}
0

Это происходит при использовании 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 не устранил проблему.

0

Я согласен с тем, что исходные параметры поддержки имеют некоторые проблемы, но для решения этой проблемы нам просто нужно добавить пользовательский макет и указать 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>
0

Вы можете получить EditText из Preference и оттуда setInputTypes или использовать KeyListeners, чтобы сообщить клавиатуре:

EditText et = (EditText) editTextPref.getEditText();
et.setKeyListener(DigitsKeyListener.getInstance());

нашел ответ на старый поток

  • 0
    К сожалению, версия EditTextPreference android.support.v7.preference больше не имеет этого метода :-(
  • 0
    @Carsten этот ответ был из более старой темы.
-2

Эй, попробуйте Это, чтобы вывести клавиатуру только с номерами

android:inputType="phone"
-4

Виджеты EditTextPreference должны иметь те же атрибуты, что и обычный EditText, поэтому используйте:

android:inputType="number"
  • 0
    это ничего не изменило, все еще позволяет мне печатать текст

Ещё вопросы

Сообщество Overcoder
Наверх
Меню