web-dev-qa-db-fra.com

Comment faire quelque chose après que l'utilisateur a cliqué sur mon EditText

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?

51
fhucho

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" />
112
Kai

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.

45
Warpzit

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).

3
Mark B

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) {

        }
    });
2
Kumar VL

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" />
2
fhucho

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.

1
Diego Torres Milano