2010-07-08 14 views
37

Co chcę zrobić, to pracuję nad grą programu życia. Chcę poświęcić trochę czasu i uczynić z niego preferencję, ale chcę udostępnić ją do wpisania w określonym czasie. Liczba może być w milisekundach lub sekundach.Preferencje liczbowe w preferencji Aktywność w Androidzie

Jednak trochę utknąłem na tym, jak postępować, nie byłem w stanie znaleźć prostej preferencji, która już to obsługuje, ale może być jedna. Czy istnieje prosty sposób dokonania tej preferencji i potwierdzenia, że ​​wprowadzone dane są liczbami całkowitymi lub na powierzchni?

Odpowiedz

16

Jeśli używasz PreferenceActivity, którego prawdopodobnie nie masz.

Trzeba będzie zrobić coś takiego:

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

Jedynym problemem jest delayPreference nie jest zdefiniowana w przykładzie (to Preference wiem) Także to jest kod wewnątrz klasy aktywności preferencji, ale wydaje się działać dobrze, dziękuję bardzo dużo. – Kinglink

81

Użyj EditTextPreference i ustawić typ wejścia do TYPE_CLASS_NUMBER. Zmusi to użytkownika do wprowadzania liczb, a nie liter.

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

Ten działa i powinien być odpowiedzią na to pytanie. Chociaż użytkownik wyświetla użytkownikowi kropkę, śpiączkę i inne wartości, użytkownik ** nie może ** wstawić ich. Tak więc tylko dane wejściowe, które z tego otrzymasz, są numeryczne. –

+26

Możesz również użyć 'android: inputType =" number "' podczas pracy z XML. – tslocum

37

Można również wymusić go za pomocą atrybutu xml android:numeric. Możliwe wartości dla tego atrybutu to decimal i integer.

+1

'EditTextPreference' nie ma parametru' numeric'. –

+8

@SYLARRR To robi. 'EditTextPreference' obsługuje wszystkie atrybuty' EditText'. I używam tego atrybutu w moim projekcie. – HRJ

+2

to zaoszczędziło mi * wiele * kłopotów - wiele dzięki – bph

28

Możesz to również zrobić bezpośrednio w swoim preferences.xml. Coś jak to będzie dział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" /> 
Powiązane problemy