Android de bază: cum să se ocupe de acțiunea isPressed pe un buton în Android

Am scris un cod de lucru folosind isEnabled ().

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

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

    );  
    }  

Acum, în loc de pachetul care urmează să fie trimis când este apăsat butonul, vreau să îl trimit când rămâne apăsat. Cum mă descurc? când am încercat isPressed în loc de isEnabled, a fost un ecran gol și activitatea nu a fost nici măcar afișată ...

EDIT: a încercat și btn.isPressed() - nu funcționează ... pachetul udp este trimis imediat după ce fac clic pe buton ... Vreau să trimit NUMAI atunci când o apăs pe el ...

Orice ajutor ar fi apreciat. Mulțumiri

0
Vrei să spui că vrei să faci ceva când utilizatorul dă clic pe buton și ține degetul pe el așa că? Clarifica.
adăugat autor Macondo2Seattle, sursa
pachetul udp este trimis imediat după ce fac clic pe butonul ... Vreau să-l trimită NUMAI atunci când îl apăs pe el ... Nu vreau nicio acțiune la apăsare ... numai când își ține degetul pe ea. .. pl ajutor
adăugat autor Zac Efron, sursa

3 răspunsuri

starea ta este vagă. "NUMAI când îl apăs" înseamnă că vei începe să trimiți când apasă butonul, ceea ce ar însemna MotionEvent.ACTION_DOWN . dacă doriți o anumită întârziere înainte ca acțiunea să fie executată, creați un fir de timer care va începe când este detectat MotionEvent.ACTION_DOWN și va executa acțiunea dvs. după câteva secunde. cronometrul ar trebui, de asemenea, să fie resetat când este detectat MotionEvent.ACTION_UP sau dacă acțiunea este deja în desfășurare, întrerupeți acțiunea.

dar sincer, poate doriți să reformulați starea dumneavoastră.

1
adăugat
acest lucru pare a fi soluția corectă pentru problema dvs. ... sunteți sigur că o implementați așa cum a fost arătat și celălalt exemplu?
adăugat autor Genia S., sursa
SAU căutați OnLongClickListener?
adăugat autor josephus, sursa
după cum am menționat în răspunsul meu, "sau dacă acțiunea este deja în desfășurare, întrerupeți acțiunea". De asemenea, cum ai fi știut că nu este doar "clic" fără un cronometru?
adăugat autor josephus, sursa
puteți urmări acest exemplu cu privire la modul de efectuare a unui cronometru de numărătoare inversă dewful.com/?p=3
adăugat autor josephus, sursa
în loc de timer, aș putea termina conexiunea UDP ... dar asta pare ineficientă ... Cred că este "bine formulată".
adăugat autor Zac Efron, sursa
Folosesc onTouchListener și MotionEvent.ACTION_DOWN. De ce am nevoie de OnLongClickListener
adăugat autor Zac Efron, sursa
Am citit din nou întrebarea și poate clarificat - "Este posibil să trimiteți pachete (gândiți voce) când apăsați butonul și apoi să terminați conexiunea atunci când butonul este reluat?"
adăugat autor Zac Efron, sursa
corect ... eșantion de cod?
adăugat autor Zac Efron, sursa

Voi doriți să utilizați butonul onTouchListener în loc de onClick și chestii. Schimbare mică pe care doriți, de asemenea, să o urmăriți atunci când utilizatorul va pleca.

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
adăugat
folosind cele de mai sus, definiți un cronometru în acțiune și anulați acțiunea în sus. de asemenea, dvs. doriți să adăugați o formă de anulare a cererii nu numai cronometrul. astfel încât dvs. doriți să doriți cererea și cronometrul ca variabile de clasă.
adăugat autor caguilar187, sursa
Nu, același rezultat din nou!
adăugat autor Zac Efron, sursa

Nu sunt sigur dacă acest lucru va funcționa, dar merită încercat

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

        }
0
adăugat
Nu Asta nu a funcționat ... Ar trebui să fie în interiorul setOnclickListener? dacă {btnTalk.isEnabled ()) {btnTalk.setOnClickListener (noul View.OnClickListener() {@Override public void onClick (Vizualizare v) {if (v.isPressed ()) {???!
adăugat autor Zac Efron, sursa
a încercat și btn.isPressed() - nu funcționează ... pachetul udp este trimis imediat după ce fac clic pe butonul ... Vreau să trimită NUMAI când îl apăs pe el ...
adăugat autor Zac Efron, sursa
Android dezvoltatori, România — Moldova
Android dezvoltatori, România — Moldova
27 participanți

Parteneri: ciupacabra.com, @php_ro, @js_ro, @node_ro iOS: @ro_ios Reguli: https://github.com/js-ro/it-telegram/blob/master/RULES.md