Sto cercando di creare un widget codice PIN personalizzato per Android come alternativa all'utilizzo di un EditText
con un attributo inputType password. Quello che mi piacerebbe mostrare è una fila di scatole, e ogni casella deve essere riempita mentre l'utente digita il suo pin.Widget inserimento codice PIN Android personalizzato
qualcun altro ha fatto qualcosa di simile, ma si è rivelato essere un numero fisso di EditText
di vista e c'era un sacco di codice brutto per lo swapping messa a fuoco come i personaggi sono stati digitati o eliminati. Questo NON è l'approccio che voglio prendere; piuttosto, sto progettando il mio per avere la lunghezza personalizzabile (facile) e comportarsi come una vista singola messa a fuoco (non così facile).
Il mio concetto finora è una sorta di ibrido tra uno LinearLayout
(per contenere le "caselle") e uno EditText
(per memorizzare l'input dell'utente).
Questo è il codice finora ...
public class PinCodeView extends LinearLayout {
protected static final int MAX_PIN_LENGTH = 10;
protected static final int MIN_PIN_LENGTH = 1;
protected int pinLength;
protected EditText mText;
public PinCodeView(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.PinCodeView);
try {
pinLength = a.getInt(R.styleable.PinCodeView_pinLength, 0);
} finally {
a.recycle();
}
pinLength = Math.min(pinLength, MAX_PIN_LENGTH);
pinLength = Math.max(pinLength, MIN_PIN_LENGTH);
setupViews();
Log.d(TAG, "PinCodeView initialized with pinLength = " + pinLength);
}
private void setupViews() {
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
for (int i = 0; i < pinLength; i++) {
// inflate an ImageView and add it
View child = inflater.inflate(R.layout.pin_box, null, false);
addView(child);
}
}
public CharSequence getText() {
// TODO return pin code text instead
return null;
}
public int length() {
// TODO return length of typed pin instead
return pinLength;
}
@Override
public boolean onCheckIsTextEditor() {
return true;
}
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
// TODO return an InputConnection
return null;
}
}
di quelle sostituzioni: onCheckIsTextEditor() dovrebbe restituire vero e onCreateInputConnection(EditorInfo outAttrs) dovrebbe restituire un nuovo oggetto InputConnection
per interagire con un InputMethod (una tastiera), ma questo è tutto quello che ho conoscere.
Qualcuno sa se sono sulla strada giusta? Qualcuno ha già lavorato con InputConnection
prima o ha creato le proprie viste modificabili in grado di fornire una guida?
(Modifica 1) Dopo aver guardato questo un po ', sembra che io dovrei sottoclasse BaseInputConnection e fornire una TextView
o EditText
come il suo obiettivo:
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
if (!onCheckIsTextEditor()) {
return null;
}
return new BaseInputConnection(mText, true);
}
Supponendo che questo non memorizzare il testo in quanto viene digitato, Ho ancora bisogno di un modo per aggiornare le viste per riflettere la modifica del contenuto ...
(Modifica 2) Così ho aggiunto questa visualizzazione personalizzata a uno schermo per il test. Mostra il numero di caselle e l'intera vista è focalizzabile, ma la tastiera non si apre mai. So che guadagna/perde messa a fuoco perché le caselle mostrano l'evidenziazione in modo appropriato e ho impostato un OnFocusChangedListener
per scrivere su logcat.
Che cosa fa apparire una tastiera reale quando una vista modificabile viene messa a fuoco?
Se ti senti generoso sarebbe bello se questo codice fosse fatto disponibile su github. Grazie per la pubblicazione! – saranicole
Mi piacerebbe molto, ma è in uso nell'app della mia azienda, quindi non so che posso rilasciare il codice sorgente per esso. Fammi controllare con il mio manager. – Karakuri
Qualche aggiornamento sul rilascio di questo su github o se qualcun altro ha già fatto questo progresso? Il codice mostrato qui sembra davvero promettente e un buon punto di partenza per gli altri, anche se apprezzerei davvero il pacchetto completo. Forse Android lo implementerà come un altro tipo di campo :) –