J'ai un EditText
qui montre le temps. Une fois que l'utilisateur a cliqué sur EditText
je souhaite afficher un TimePickerDialog
, j'ai donc défini un View.OnClickListener
Sur mon EditText
.
Mais le OnClickListener
se comporte bizarrement - je touche le EditText
puis le clavier logiciel apparaît (ce que je ne veux pas). Lorsque je touche à nouveau, OnClickListener.onClick()
est enfin appelée et la boîte de dialogue apparaît.
Que dois-je faire si je veux que la boîte de dialogue apparaisse immédiatement?
Contrairement à la plupart des autres commandes, les EditText
sont focalisables lorsque le système est en "mode tactile". Le premier événement de clic concentre le contrôle, tandis que le deuxième événement de clic déclenche réellement le OnClickListener
. Si vous désactivez la mise au point en mode tactile avec le Android:focusableInTouchMode
Voir l'attribut, le OnClickListener
devrait se déclencher comme prévu.
<EditText
Android:text="@+id/EditText01"
Android:id="@+id/EditText01"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:focusableInTouchMode="false" />
Une autre solution consiste à utiliser le 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...
}
});
S'il renvoie true
, l'événement est géré et le clavier ne s'affiche pas. Si vous souhaitez que le clavier continue de s'afficher et s'enregistre, cliquez dessus pour qu'il renvoie false
.
Il semble que vous ne souhaitiez pas que l'utilisateur puisse réellement taper dans EditText. Vous voulez juste qu'ils puissent choisir une heure via un sélecteur de temps. Alors pourquoi pas juste un bouton qui fait apparaître un TimePickerDialog? Vous pouvez afficher l'heure sélectionnée dans une TextView.
Ou vous pouvez simplement remplacer la vue EditText par une vue TimePicker (pas une boîte de dialogue, juste une vue normale).
Au lieu de toucher Listener, utilisez Text Change 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) {
}
});
J'ai résolu cela en utilisant un bouton personnalisé comme celui-ci:
<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" />
Si je comprends bien, vous avez juste besoin de quelque chose comme
<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 modifiable et cliquable. Définissez le OnClickListener
et vous avez terminé. En théorie, dans la pratique, vous devez également ajouter
Android:editable="false"
qui est obsolète mais fait l'affaire.