2012-05-06 9 views
5

Sto tentando di applicare una sorta di verifica a un edittext. Un utente dovrebbe essere in grado di inserire solo numeri interi tra 1 e 60. Mi chiedo se dovrei lasciare che digitino ciò che vogliono e quando si concentrano su eittext controllano il contenuto e se è fuori limite, cambia il valore in un valore predefinito , diciamo 0.Limite Android ModificaTesto su Solo numero intero

Oppure esiste un modo per limitare la tastiera per consentire solo numeri interi?

AGGIORNAMENTO: Sto facendo tutto al livello di programmazione. Finora sono stato in grado di limitare solo input numerici e avere un massimo di 2 caratteri implementando quanto segue. Sto ancora lottando per limitare solo i valori tra 0 e 60 però.

editText.setInputType(InputType.TYPE_CLASS_NUMBER); 
    InputFilter[] FilterArray = new InputFilter[1]; 
    FilterArray[0] = new InputFilter.LengthFilter(2); 
    editText.setFilters(FilterArray); 

risposta

1

Se si limita al solo numeri, è possibile utilizzare il

EditText.addTextChangedListener 

per ottenere il valore inputed e verificare che non è più di 60

Si può facilmente permettere solo i numeri con l'aggiunta di android:numeric="integer" a EditText nel file xml layout

Anche se vale la pena ricordare che android:numeric="integer" è ora deprecato

+0

'android: numerico =" intero "' è molto fine e maneggevole, ma purtroppo è deprecato. – TechNyquist

2

È possibile utilizzare android.text.method.KeyListener per sostituire l'ingresso corrente con qualsiasi cosa si desideri.

Dal momento che non dovete cambiare tutti i tasti è possibile utilizzare addTextChangedListener(TextWatcher watcher) metodo come questo:

EditText editT = (EditText) findViewById(R.id.your_id); 
editT.addTextChangedListener(new TextWatcher() { 
@Override 
public void afterTextChanged(Editable s) { 
    // TODO Auto-generated method stub 
} 

@Override 
public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
    // TODO Auto-generated method stub 
} 

@Override 
public void onTextChanged(CharSequence s, int start, int before, int count) { 
    // TODO Auto-generated method stub 

}); 

Fare uso di esso per verificare se l'input è al di là di quello che stai cercando e si può anche trascurare le chiavi controllando su quel ciclo.

In XML:

  • Se si utilizza i numeri utilizzare solo android:inputType="number".
  • Per limitare il numero di cifre a 2 includere android:maxLength="2".
1

Ce l'ho! Ho setacciato internet per sempre e ho messo insieme alcune cose per farlo funzionare. Fondamentalmente ciò che fa è eseguire un processo parallelo che sarà costantemente in esecuzione mentre l'utente si focalizzerà sulla specifica casella di edittext. Imposta un filtro in modo che l'utente possa inserire solo 0-5 nel primo slot intero, ma sarà consentito inserire 0-9 per il secondo. Ovviamente questo darà 0-59 anziché 1-60, ma è quello che vuoi per secondi comunque. Questo codice va prima che il metodo onCreate, all'interno della classe:

final InputFilter filter = new InputFilter() 
{ 
    public CharSequence filter(CharSequence source, int start, int end, 
       Spanned dest, int dstart, int dent) 
    { 
     for (int i = start; i < end; i++) 
     { 
      if ((source.charAt(start) == "6".charAt(0)) || (source.charAt(start) == "7".charAt(0)) || (source.charAt(start) == "8".charAt(0)) 
        || (source.charAt(start) == "9".charAt(0)) || (!Character.isDefined(source.charAt(i))))        
      { 
       return ""; 
      } 
     } 
     return null; 
    } 
}; 

private class FilterCheckerTask extends AsyncTask<Void, Void, Void> 
{  
    @Override 
    protected Void doInBackground(Void... params) 
    {   
     while(true) 
     {    
      if (<EditText>.getText().toString().isEmpty()) 
      { 
       Log.e("empty","empty");     
       <EditText>.setFilters(new InputFilter[]{filter, new InputFilter.LengthFilter(2)});    
      } 
      else if (<EditText>.getText().toString().charAt(0) >= "6".charAt(0)) 
      { 
       Log.e("front num bad","greater than 5"); 
       <EditText>.setFilters(new InputFilter[]{filter, new InputFilter.LengthFilter(2)}); 
      } 
      else 
      { 
       Log.e("unfiltered", "unfiltered"); 
       <EditText>.setFilters(new InputFilter[]{new InputFilter.LengthFilter(2)});  
      } 
      if (kicker) 
      { 
       return null; 
      } 
     }   
    }  
} 

Poi, all'interno del metodo onCreate:

Time_sec.setOnFocusChangeListener(new OnFocusChangeListener() 
    { 
     public void onFocusChange(View v, boolean hasFocus) 
     { 
      new FilterCheckerTask().execute(); 
      if(!hasFocus) 
        {kicker = !hasFocus;}        

     } 
    }); 

Come ho detto nella prima parte, questo farà in modo che l'utente è possibile inserire solo numeri compresi tra 00 e 59 nella propria casella di modifica.So che può sembrare un po 'trascurato, e può probabilmente essere ripulito un po' in alcune delle istruzioni if, ma per quanto posso dire funziona perfettamente, e non sembra affatto rallentare il sistema. Spero che questo ti aiuti, e in caso contrario, i futuri googler.

+0

Cosa fare se voglio mettere solo 7 lì? – Iurii