2010-07-08 12 views
37

Lo que quiero hacer es trabajar en un programa de juego de la vida. Quiero tomar el tiempo de demora y convertirlo en una preferencia, pero quiero que esté disponible para que la gente escriba en un momento específico. El número puede ser en milisegundos o segundos.Preferencias de número en actividad de preferencias en Android

Sin embargo, estoy un poco atascado sobre cómo proceder, no he podido encontrar una preferencia simple que ya maneje esto, pero podría haber una. ¿Hay alguna manera fácil de hacer esta preferencia y confirmar que los datos ingresados ​​son enteros o están a flote?

Respuesta

16

Si está utilizando una PreferenceActivity que probablemente sea, no hay ninguna disponible.

Usted tendrá que hacer algo como esto:

/** 
* Checks that a preference is a valid numerical value 
*/ 
Preference.OnPreferenceChangeListener numberCheckListener = new OnPreferenceChangeListener() { 

    @Override 
    public boolean onPreferenceChange(Preference preference, Object newValue) { 
     //Check that the string is an integer. 
     return numberCheck(newValue); 
    } 
}; 

private boolean numberCheck(Object newValue) { 
    if(!newValue.toString().equals("") && newValue.toString().matches("\\d*")) { 
     return true; 
    } 
    else { 
     Toast.makeText(ActivityUserPreferences.this, newValue+" "+getResources().getString(R.string.is_an_invalid_number), Toast.LENGTH_SHORT).show(); 
     return false; 
    } 
} 


    @Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    //get XML preferences 
    addPreferencesFromResource(R.xml.user_preferences); 


    //get a handle on preferences that require validation 
    delayPreference = getPreferenceScreen().findPreference("pref_delay"); 

    //Validate numbers only 
    delayPreference.setOnPreferenceChangeListener(numberCheckListener); 

} 
+0

único problema es delayPreference no está definido en el ejemplo (que es una preferencia que sé) También este es el código para el interior de la clase de actividad preferencia, pero parece funcionar bien, muchas gracias mucho. – Kinglink

81

utilizar un EditTextPreference y establecer el tipo de entrada a TYPE_CLASS_NUMBER. Esto forzará al usuario a ingresar números y no letras.

EditTextPreference pref = (EditTextPreference)findPreference("preference_name"); 
pref.getEditText().setInputType(InputType.TYPE_CLASS_NUMBER); 
+9

Éste funciona y debería ser la respuesta a esta pregunta. Aunque se muestran al usuario puntos, coma y otros valores, el usuario ** no puede ** insertarlos. Entonces, solo la entrada que recibe de esto es numérica. –

+26

También puede usar 'android: inputType =" number "' cuando trabaje con XML. – tslocum

37

También puede forzarlo con el atributo xml android:numeric. Los posibles valores relevantes para este atributo son decimal y integer.

+1

'EditTextPreference' no tiene el parámetro' numeric'. –

+8

@SYLARRR Sí. El 'EditTextPreference' admite todos los atributos de' EditText'. Y estoy usando este atributo en mi proyecto. – HRJ

+2

esto me ha ahorrado * muchas * molestias, muchas gracias – bph

28

También puede hacerlo directamente en su preferences.xml. Algo como esto funcionaría:

<EditTextPreference 
    android:defaultValue="100" 
    android:dialogTitle="@string/pref_query_limit" 
    android:inputType="number" 
    android:key="pref_query_limit" 
    android:summary="@string/pref_query_limit_summ" 
    android:title="@string/pref_query_limit" /> 
Cuestiones relacionadas