98 votes

Android EditText onClickListener

Je veux un EditText qui crée un DatePicker lorsque vous appuyez dessus. Alors j'écris le code suivant:

     mEditInit = (EditText) findViewById(R.id.date_init);
    mEditInit.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            showDialog(DATEINIT_DIALOG);
        }

    });
 

Mais lorsque j'appuie sur EditText, l'action est typique: un curseur en attente de saisie du texte affiche le dialogue que je souhaite.

Une idée?

Merci

138voto

Dillon Kearns Points 1249

Le clavier semble de pop-up lorsque l'EditText obtient le focus. Pour éviter cela, réglez focusable false:

<EditText
    ...
    android:focusable="false"
    ... />

Ce comportement peut varier en fonction des fabricants de système d'exploitation Android de saveurs, mais sur la appareils que j'ai testé, j'ai trouvé que c'était suffisant. Si le clavier encore pop-up, à l'aide d'indicateurs plutôt que du texte semble aider ainsi:

myEditText.setText("My text");    // instead of this...
myEditText.setHint("My text");    // try this

Une fois que vous avez fait cela, votre sur cliquez auditeur doit travailler comme vous le souhaitez:

myEditText.setOnClickListener(new OnClickListener() {...});

66voto

Marco W. Points 2685

Normalement, vous voulez un maximum de compatibilité avec EditText's un comportement normal.

Donc vous ne devriez pas utiliser android:focusable="false" que, oui, la vue sera tout simplement pas être focusable plus qui semble mauvais. L'arrière-plan dessiné ne sera pas montrer sa "touche" état plus, par exemple.

Ce que vous devez faire à la place est la suivante:

myEditText.setInputType(InputType.TYPE_NULL);
myEditText.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // showMyDialog();
    }
});
myEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            // showMyDialog();
        }
    }
});

En définissant le type d'entrée à l' TYPE_NULL, vous empêcher le logiciel de clavier de popping up.

Par le réglage de l' OnClickListener et OnFocusChangeListener, vous vous assurez que votre boîte de dialogue s'ouvre toujours lorsque l'utilisateur clique dans l' EditText champ, lorsqu'elle obtient le focus (le premier clic) et sur les clics.

Juste paramètre android:inputType="none" ou setInputType(InputType.TYPE_NULL) n'est pas toujours suffisant. Pour certains appareils, vous devez définir android:editable="false" en XML ainsi, même si c'est déconseillé. Si cela ne fonctionne pas plus, il va juste être ignoré (comme de tous les attributs XML qui ne sont pas pris en charge).

32voto

Yusuf Hoque Points 166

J'ai eu le même problème. Le code est correct mais assurez-vous de changer la valeur de la valeur de focus du EditText en false.

 <EditText
android:id="@+id/date"
android:focusable="false"/>
 

J'espère que cela aide tous ceux qui ont eu un problème similaire!

18voto

raychenon Points 1068

Voici la solution que j'ai mise en place

 mPickDate.setOnKeyListener(new View.OnKeyListener() {

    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        showDialog(DATE_DIALOG_ID);
        return false;
    }
});
 

OU

 mPickDate.setOnFocusChangeListener(new View.OnFocusChangeListener() {

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        showDialog(DATE_DIALOG_ID);

    }
});
 

Voyez les différences par vous-même. Le problème est depuis (comme RickNotFred l’a dit) TextView pour afficher la date et le modifier via le DatePicker. TextEdit n'est pas utilisé pour son objectif principal. Si vous souhaitez que le DatePicker réapparaisse, vous devez saisir delete (1er cas) ou de mise au point (2nd cas).

Rayon

8voto

fishjd Points 560

À mon humble avis je suis en désaccord avec RickNotFred de la déclaration:

L'affichage d'une boîte de dialogue lorsqu'un EditText obtient l'accent semble être un non-standard de l'interface.

L'affichage d'une boîte de dialogue pour modifier la date lors de l'utilisation des presses à l'un EditText est très similaire à la valeur par défaut est d'afficher un clavier ou un pavé numérique. Le fait que la date s'affiche avec le EditText signaux à l'utilisateur que la date peut être modifiée. L'affichage de la date en tant que non-modifiable TextView signaux à l'utilisateur que la date ne peut pas être changé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X