Android de base: comment gérer l'action isPressed sur un bouton dans Android

J'ai écrit un code de travail en utilisant isEnabled ().

    if(btn.isEnabled()){    
        btn.setOnClickListener(new View.OnClickListener() {    

        @Override  
        public void onClick(View v) {   
   //say send a udp packet  
        }  
        }  

    );  
    }  

Maintenant, au lieu du paquet à envoyer quand le bouton est cliqué, je veux l’envoyer quand il reste appuyé. Comment puis-je gérer cela? Quand j'ai essayé isPressed au lieu de isEnabled, il y avait un écran vide et l'activité n'était même pas affichée ...

EDIT: a également essayé btn.isPressed() - ça ne marche pas ... le paquet udp est envoyé immédiatement après que je clique sur le bouton ... Je veux l’envoyer UNIQUEMENT quand j’appuie dessus ...

Toute aide serait appréciée. Merci

0
Voulez-vous dire que vous voulez faire quelque chose lorsque l'utilisateur clique sur le bouton ET le garde au doigt pour qu'il le soit? Précisez s'il vous plaît.
ajouté l'auteur Macondo2Seattle, source
le paquet udp est envoyé immédiatement après que je clique sur le bouton ... Je veux l'envoyer UNIQUEMENT lorsque je l'appuie ... Je ne veux aucune action sur un clic ... seulement lorsqu'il garde le doigt dessus. .. pl aide
ajouté l'auteur Zac Efron, source

3 Réponses

Votre condition est vague. "UNIQUEMENT lorsque j'appuie dessus" signifie que vous commencerez à envoyer lorsque le bouton commencera à être actionné, ce qui voudrait dire sur MotionEvent.ACTION_DOWN . si vous souhaitez un peu de retard avant que l'action soit exécutée, créez un thread de minuterie qui démarrera lorsque MotionEvent.ACTION_DOWN sera détecté et exécutera votre action après quelques secondes. le temporisateur doit également être réinitialisé lorsque MotionEvent.ACTION_UP est détecté ou, si l'action est déjà en cours, l'interrompre.

mais honnêtement, vous voudrez peut-être reformuler votre condition.

1
ajouté
cela semble être la solution correcte à votre problème énoncé ... êtes-vous sûr de le mettre en œuvre de la même manière que l'autre exemple?
ajouté l'auteur Genia S., source
OU, cherchez-vous OnLongClickListener?
ajouté l'auteur josephus, source
comme je l'ai mentionné dans ma réponse, "ou si l'action est déjà en cours, interrompez l'action". aussi, comment sauriez-vous que ce n'est pas juste "cliqué" sans minuterie?
ajouté l'auteur josephus, source
Vous pouvez suivre cet exemple pour créer un compte à rebours dewful.com/?p=3 .
ajouté l'auteur josephus, source
au lieu de la minuterie, je pourrais mettre fin à la connexion UDP ... mais cela semble inefficace? ... Je pense que c'est "exprimé" parfaitement.
ajouté l'auteur Zac Efron, source
J'utilise onTouchListener et MotionEvent.ACTION_DOWN. Pourquoi j'ai besoin de OnLongClickListener
ajouté l'auteur Zac Efron, source
Je relis la question et peut-être clarifier- "Est-il possible d'envoyer des paquets (pensez voix) lorsque le bouton est enfoncé puis de mettre fin à la connexion lorsque le bouton est relâché?"
ajouté l'auteur Zac Efron, source
correct ... exemple de code?
ajouté l'auteur Zac Efron, source

Vous allez vouloir utiliser onTouchListener au lieu de onClick et d'autres choses. Petit changement que vous souhaitez également suivre lorsque l'utilisateur le laisse partir.

EDIT adding timer stuff

Timer timer;
UDP request;
btn.setOnTouchListener(new OnTouchListener(){

     public boolean onTouch(View v, MotionEvent event){
         if(event.getAction() == MotionEvent.ACTION_DOWN){
             //TODO start sending udp in background
             timer = new Timer();
             timer.schedule(new TimerTask(){
                public void run(){
                    request.start();
                }
             },DELAY_MS);

         }
         if(event.getAction() == MotionEvent.ACTION_UP){
             //TODO stop sending udp
             timer.cancel()

             if(request.isTransmitting()){ 
                request.stop();
             }
         }
         //needed to get both calls
         return true;
     }
});
0
ajouté
en utilisant ce qui précède, définissez simplement une minuterie en action et annulez-la en action. Vous voudrez également ajouter une forme d’annulation à la demande et pas seulement au temporisateur. de sorte que vous allez vouloir la demande et la minuterie en tant que variables de classe.
ajouté l'auteur caguilar187, source
Non, même résultat encore!
ajouté l'auteur Zac Efron, source

Pas sûr que ça marche, mais ça vaut le coup d'essayer

@Override
        public void onClick(View v) {
           //TODO Auto-generated method stub
            if(v.isPressed()){
            //do sth.   
            }
            else{
            //do sth. else  
            }

        }
0
ajouté
Non, cela n'a pas fonctionné ... Cela devrait-il être à l'intérieur de setOnclickListener? if (btnTalk.isEnabled ()) {btnTalk.setOnClickListener (new View.OnClickListener() {@Override public void onClick (Afficher v) {if (v.isPressed ()) {???!
ajouté l'auteur Zac Efron, source
a également essayé btn.isPressed() - ça ne marche pas ... le paquet udp est envoyé immédiatement après que je clique sur le bouton ... Je veux que ce soit envoyé UNIQUEMENT quand je l'appuie ...
ajouté l'auteur Zac Efron, source