Basic Android: hoe moet gepresteerde actie worden uitgevoerd op een knop in Android

Ik schreef een werkende code met isEnabled ().

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

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

    );  
    }  

In plaats van het pakket dat moet worden verzonden wanneer op de knop wordt geklikt, wil ik het verzenden wanneer het wordt ingedrukt. Hoe ga ik hiermee om? toen ik probeerde is gedrukt in plaats van is-niet-ingeschakeld, was er een leeg scherm en werd de activiteit niet eens weergegeven ...

EDIT: ook geprobeerd btn.isPressed() - het werkt niet ... het udp-pakket wordt onmiddellijk verzonden nadat ik op de knop klik ... Ik wil dat het ALLEEN verzendt wanneer ik het druk ...

Alle hulp wordt op prijs gesteld. Bedankt

0
Bedoel je dat je iets wilt doen wanneer de gebruiker op de knop klikt EN er de vinger op houdt, dus? Gelieve te verduidelijken.
toegevoegd de auteur Macondo2Seattle, de bron
het udp-pakket wordt onmiddellijk verzonden nadat ik op de knop klik ... Ik wil dat het ALLEEN verzendt wanneer ik het druk ... Ik wil geen actie op klik ... alleen als hij de vinger erop houdt. .. pl help
toegevoegd de auteur Zac Efron, de bron

3 antwoord

je conditie is vaag. "ALLEEN wanneer ik het druk" zou betekenen dat u begint te verzenden wanneer de knop wordt ingedrukt, wat zou betekenen op MotionEvent.ACTION_DOWN . als u wat vertraging wilt voordat de actie wordt uitgevoerd, maakt u een timertijddraad die zou starten wanneer MotionEvent.ACTION_DOWN wordt gedetecteerd en uw actie na enkele seconden zal uitvoeren. de timer moet ook worden gereset als MotionEvent.ACTION_UP wordt gedetecteerd, of als de actie al aan de gang is, onderbreek dan de actie.

maar eerlijk gezegd, wil je misschien je toestand opnieuw formuleren.

1
toegevoegd
dit lijkt de juiste oplossing voor uw probleem ... weet u zeker dat u het implementeert zoals het andere voorbeeld werd getoond?
toegevoegd de auteur Genia S., de bron
OF, ben je op zoek naar OnLongClickListener?
toegevoegd de auteur josephus, de bron
zoals ik in mijn antwoord heb genoemd: "of als de actie al aan de gang is, onderbreek dan de actie". ook, hoe zou je het weten, het is niet zomaar "geklikt" zonder een timer?
toegevoegd de auteur josephus, de bron
u kunt dit voorbeeld volgen over het maken van een afteltimer dewful.com/?p=3
toegevoegd de auteur josephus, de bron
in plaats van de timer, zou ik de UDP-verbinding kunnen beëindigen ... maar dat lijkt inefficiënt? ... Ik denk dat het perfect is "geformuleerd".
toegevoegd de auteur Zac Efron, de bron
Ik gebruik onTouchListener en MotionEvent.ACTION_DOWN. Waarom heb ik OnLongClickListener nodig?
toegevoegd de auteur Zac Efron, de bron
Ik herlees de vraag en misschien om op te helderen: "Is het mogelijk om pakketten te verzenden (denk stem) wanneer de knop wordt ingedrukt en dan de verbinding te beëindigen wanneer de knop wordt losgelaten?"
toegevoegd de auteur Zac Efron, de bron
juiste ... voorbeeldcode?
toegevoegd de auteur Zac Efron, de bron

Je gaat de onTouchListener gebruiken in plaats van onClick enzo. Kleine wijziging die u ook wilt bijhouden wanneer de gebruiker het los laat.

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
toegevoegd
gebruik het bovenstaande om een ​​timer in actie neer te zetten en annuleer deze voor actie omhoog. je wilt ook een of andere vorm van annuleren toevoegen aan het verzoek, niet alleen aan de timer. dus je wilt het verzoek en de timer als klassevariabelen.
toegevoegd de auteur caguilar187, de bron
Nee, hetzelfde resultaat opnieuw!
toegevoegd de auteur Zac Efron, de bron

Niet zeker of dit zal werken, maar het proberen waard

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

        }
0
toegevoegd
Nee Dat werkte niet ... Zou het binnen de setOnclickListener moeten zijn? if (btnTalk.isEnabled ()) {btnTalk.setOnClickListener (new View.OnClickListener() {@Override public void onClick (View v) {if (v.isPressed ()) {???!
toegevoegd de auteur Zac Efron, de bron
probeerde ook btn.isPressed() - het werkt niet ... het udp-pakket wordt onmiddellijk verzonden nadat ik op de knop klik ... Ik wil dat het ALLEEN verzendt wanneer ik het druk ...
toegevoegd de auteur Zac Efron, de bron