Come fare qualcosa dopo l'utente fa clic sul mio EditText
-
22-09-2019 - |
Domanda
Ho un EditText
che mostra il tempo. Dopo che l'utente fa clic sul EditText
voglio mostrare un TimePickerDialog
, così mi sono messo un View.OnClickListener
al mio EditText
.
Ma la OnClickListener
si comporta stranamente - mi tocco il EditText
e poi appare la tastiera software (che io non voglio). Quando tocco di nuovo, OnClickListener.onClick()
viene finalmente chiamato e viene visualizzata la finestra di dialogo.
Cosa devo fare se voglio la finestra appaia immediatamente?
Soluzione
A differenza di molti altri controlli, EditText
s sono attivabile mentre il sistema è in modalità 'touch'. Il primo evento click si concentra il controllo, mentre il secondo evento click in realtà spara il OnClickListener
. Se si disattiva messa a fuoco touch-mode con l'attributo android:focusableInTouchMode
View, il OnClickListener
dovrebbe sparare come previsto.
<EditText
android:text="@+id/EditText01"
android:id="@+id/EditText01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusableInTouchMode="false" />
Altri suggerimenti
Un'altra soluzione è quella di utilizzare il ontouchlistener
:
edittext.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(MotionEvent.ACTION_UP == event.getAction()) {
mQuaternion_1.setText("" + mQ1);
}
return true; // return is important...
}
});
Se ritorna true
l'evento viene gestito e la tastiera pop-up abituato. Se ci si vuole far apparire la tastiera ancora e registrare cliccare avresti lo avete tornare false
.
Sembra che non si desidera che l'utente sia effettivamente in grado di digitare l'EditText. Volete solo loro di essere in grado di scegliere un momento tramite un selettore di tempo. Allora, perché non solo un pulsante che apre una TimePickerDialog? Si potrebbe visualizzare il tempo che è stato raccolto in un TextView.
Oppure si può semplicemente sostituire la vista EditText con un TimePicker vista (non una finestra di dialogo, solo una vista normale).
Ho risolto questo utilizzando un pulsante personalizzato in questo modo:
<Button
android:id="@+id/btTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:text="test"
android:textSize="20dp"
android:background="@android:drawable/edit_text" />
Invece di tocco utilizzo Listener Testo Cambio Listener:
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
//yourFunction();
}
@Override
public void afterTextChanged(Editable s) {
}
});
Se ho capito bene basta qualcosa come
<EditText android:text="@+id/EditText01" android:id="@+id/EditText01"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:clickable="true" android:inputType="none" />
non modificabile e cliccabile. Impostare la OnClickListener
e il gioco è fatto.
In teoria, nella pratica si dovrebbe aggiungere anche
android:editable="false"
che è deprecato, ma fa il trucco.