Je sais que c'est une vieille question avec une réponse déjà acceptée mais je pense que ma solution peut être utile pour quelqu'un cherchant une réponse plus complète. J'ai juste amélioré la réponse de @broot un peu et voici ma solution :
Remplacez EditTextPreference pour fournir une conversion de texte en int :
public class IntEditTextPreference extends EditTextPreference implements EditTextPreference.OnBindEditTextListener {
private String mText;
public IntEditTextPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
setOnBindEditTextListener(this);
}
public IntEditTextPreference(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
setOnBindEditTextListener(this);
}
public IntEditTextPreference(Context context, AttributeSet attrs) {
super(context, attrs);
setOnBindEditTextListener(this);
}
public IntEditTextPreference(Context context) {
super(context);
setOnBindEditTextListener(this);
}
/**
* Enregistre le texte dans le stockage de données actuel.
*
* @param text Le texte à enregistrer
*/
public void setText(String text) {
final boolean wasBlocking = shouldDisableDependents();
mText = text;
int value = Integer.parseInt(text);
persistInt(value);
final boolean isBlocking = shouldDisableDependents();
if (isBlocking != wasBlocking) {
notifyDependencyChange(isBlocking);
}
notifyChanged();
}
/**
* Récupère le texte à partir du stockage de données actuel.
*
* @return La valeur de préférence actuelle
*/
public String getText() {
return mText;
}
@Override
protected void onSetInitialValue(Object defaultValue) {
int value;
if (defaultValue != null) {
String strDefaultValue = (String) defaultValue;
int defaultIntValue = Integer.parseInt(strDefaultValue);
value = getPersistedInt(defaultIntValue);
} else {
value = getPersistedInt(0);
}
setText(Integer.toString(value));
}
@Override
public boolean shouldDisableDependents() {
return TextUtils.isEmpty(mText) || super.shouldDisableDependents();
}
@Override
public void onBindEditText(@NonNull EditText editText) {
editText.setInputType(InputType.TYPE_CLASS_NUMBER);
}
}
Dans le fichier de préférences xml :
Remarque : Ne pas utiliser android:numérique ni android:inputType. Comme EditTextPreference n'est pas un EditText lui-même, définir ces attributs ne fera rien. Pour obtenir l'effet souhaité sur l'EditText de la boîte de dialogue ouverte par EditTextPreference, définissez simplement le type d'entrée dans votre custom EditTextPreference en implémentant EditTextPreference.OnBindEditTextListener
comme vous pouvez le voir dans le code ci-dessus.
C'est ce qui a fonctionné pour moi.