IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Mon OnClickListener ne fonctionne qu'une fois sur deux sur mes EditText


Sujet :

Android

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Points : 103
    Points
    103
    Par défaut Mon OnClickListener ne fonctionne qu'une fois sur deux sur mes EditText
    Bonjour à tous,

    Je débute en développement Android et j'ai suivi un tutoriel Android pour comprendre les listeners. Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    public class MainActivity extends Activity {
    
    	private TextView ReservationReference = null;
    	private TextView LastName = null;
    	
    	private android.view.View.OnClickListener TextViewClickListener = new View.OnClickListener() //Curieusement, ne marche pas sans le préfixe "android.view.View." malgré l'import 
    	{
    		public void onClick(View v) {
    			((TextView)v).setText(null);
    		}
    	};
    	
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            ReservationReference = (TextView)findViewById(R.id.ReservationReference);
            LastName = (TextView)findViewById(R.id.LastName);
            
            ReservationReference.setOnClickListener(TextViewClickListener); //Ne fonctionne qu'à partir du second clic...      
            LastName.setOnClickListener(TextViewClickListener); //Ne fonctionne qu'à partir du second clic...
            
            ReservationReference.setOnFocusChangeListener(new OnFocusChangeListener()
    		{
    			public void onFocusChange(View v, boolean hasFocus) {
    				if (!hasFocus && (((TextView)v).getText().toString().equals(""))) //La seconde règle n'est jamais respectée
    				{
    					((TextView)v).setText("Reservation Reference");
    				}
    			}
    		});
            
            LastName.setOnFocusChangeListener(new OnFocusChangeListener()
    		{
    			public void onFocusChange(View v, boolean hasFocus) {
    				if (!hasFocus && (((TextView)v).getText().toString().equals(""))) //La seconde règle n'est jamais respectée
    				{
    					((TextView)v).setText("Last Name");
    				}
    			}
    		});
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.activity_main, menu);
            return true;
        }
    }
    Mes problèmes sont mentionnés en commentaire dans mon code. En effet, je ne comprends pas pourquoi le texte dans mes EditText (castées en TextView) ne disparait qu'à partir de la deuxième fois où je clique dessus, à l'exception de la toute première fois où je clique sur l'une des deux au lancement de l'application sur mon smartphone (je travaille avec un Galaxy S3). Les OnFocusChange, eux, fonctionnent correctement.

    Par ailleurs, si ce n'est pas "la bonne façon de faire", merci de m'orienter. En effet, il y a tellement de listeners différents que je me suis perdu...

    Merci de votre aide.

  2. #2
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Code un poil reformaté... et pour le test de chaine vide il suffit de vérifier la longueur...

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    import android.view.View.OnClickListener;
    
    public class MainActivity extends Activity {
        // en général, pour des raisons de lisibilité, seuls les types (enum,class,interfaces) commencent par une majuscule
        private TextView reservationReference = null;
        private TextView lastName = null;
    
        // marche très bien en important OnClickListener.	
        private OnClickListener textViewClickListener = new OnClickListener()
        {    
            public void onClick(View v) {
                ((TextView)v).setText(null);
            }
        };
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            // j'aime bien 'forcer' le this. pour montrer que la variable est une membre de la classe.
            this.reservationReference = (TextView)findViewById(R.id.ReservationReference);
            this.lastName = (TextView)findViewById(R.id.LastName);
            
            this.reservationReference.setOnClickListener(this.textViewClickListener);
            this.lastName.setOnClickListener(TextViewClickListener); 
            
            reservationReference.setOnFocusChangeListener( new OnFocusChangeListener()
    	  {
    		public void onFocusChange(View v, boolean hasFocus) {
                            String text = ((TextView)v).getText();
    			if (!hasFocus && (text == null || text .length() == 0)) {
                                ((TextView)v).setText("Reservation Reference");
                            }
                     }
               });
            
            this.lastName.setOnFocusChangeListener(new OnFocusChangeListener()
    	   {
                   public void onFocusChange(View v, boolean hasFocus) {
                       String text = ((TextView)v).getText();
                       if (!hasFocus && (text == null || text.length() == 0)) {					
                            ((TextView)v).setText("Last Name");
                       }
                    }
                 });
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.activity_main, menu);
            return true;
        }
    }
    Je pense qu'il y a un problême sur le 'click' qui arrive *avant* le focus... il faudrait mettre un poil de "Log.t()" pour voir ce qu'il se passe en détails...


    Par ailleurs, si ce n'est pas "la bonne façon de faire", merci de m'orienter. En effet, il y a tellement de listeners différents que je me suis perdu...
    Ben je sais pas trop ce que tu veux faire... j'ai la vague impression que tu veux coller un "texte par défaut" qui disparaît quand on clique sur le champ... Pour info, l'attribut "android:hint" fait exactement cela, sans aucun code (et la localisation en prime).

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par nicroman Voir le message
    Pour info, l'attribut "android:hint" fait exactement cela, sans aucun code (et la localisation en prime).
    Chouette, c'est exactement ce que je voulais.
    Merci beaucoup!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2010] Exportation d'un recordset vers Excel ne fonctionne qu'une fois sur deux
    Par Scregneugneu dans le forum VBA Access
    Réponses: 3
    Dernier message: 11/03/2012, 19h47
  2. [AC-2007] After Insert qui fonctionne mal une fois sur deux
    Par DamKre dans le forum IHM
    Réponses: 4
    Dernier message: 27/12/2011, 10h29
  3. Code qui ne fonctionne qu'une fois sur 2!
    Par Optimiss dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 04/03/2010, 10h41
  4. AMFPHP qui ne fonctionne pas une fois mon swf en ligne
    Par Grimdol dans le forum ActionScript 3
    Réponses: 5
    Dernier message: 24/04/2009, 12h20
  5. Fermeture d'un formulaire : Ne fonctionne qu'une fois sur deux
    Par hellmaster78 dans le forum VBA Access
    Réponses: 6
    Dernier message: 02/04/2008, 11h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo