2010-07-08 6 views
37

Quello che voglio fare è che sto lavorando a un gioco di programma di vita. Voglio prendere il tempo di ritardo e renderlo una preferenza, ma voglio renderlo disponibile per le persone a digitare in un momento specifico. Il numero può essere in millisecondi o secondi.Numero preferenze nelle attività preferite in Android

Tuttavia sono un po 'bloccato su come procedere, non sono stato in grado di trovare una semplice preferenza che già gestisce questo, ma potrebbe essercene uno. C'è un modo semplice per fare questa preferenza e confermare che i dati inseriti sono interi o in mare?

risposta

16

Se si utilizza PreferenceActivity, probabilmente non ce n'è uno disponibile.

Avrete bisogno di fare qualcosa di simile:

/** 
* 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

unico problema è delayPreference non è definito nell'esempio (si tratta di una preferenza lo so) Anche questo è il codice per all'interno della classe di attività preferenza, ma sembra funzionare bene, vi ringrazio tanto. – Kinglink

81

Utilizzare un EditTextPreference e impostare il tipo di ingresso a TYPE_CLASS_NUMBER. Ciò costringerà l'utente a immettere numeri e non lettere.

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

Questo funziona e dovrebbe essere la risposta a questa domanda. Sebbene vengano visualizzati all'utente, punto, virgola e altri valori, l'utente ** non può ** inserirli. Quindi solo l'input che ricevi da questo è numerico. –

+26

Puoi anche usare 'android: inputType =" number "' quando lavori con XML. – tslocum

37

Si può anche farla rispettare con l'attributo xml android:numeric. I possibili valori rilevanti per questo attributo sono decimal e integer.

+1

'EditTextPreference' non ha parametro' numerico'. –

+8

@SYLARRR Lo fa. 'EditTextPreference' supporta tutti gli attributi di' EditText'. E sto usando questo attributo nel mio progetto. – HRJ

+2

questo mi ha salvato un * sacco * di problemi - molte grazie – bph

28

È anche possibile farlo direttamente nel proprio preferences.xml. Qualcosa di simile a questo dovrebbe funzionare:

<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" />