2011-08-25 17 views
5

Problem:Android :: OnTouchListener && OnClickListener kombinacja kwestia opis

Mam TextView na RelativeLayout i chcę to kolor czerwony, gdy użytkownik dotyka go i przejść na inną stronę, kiedy kliknie na nim. Tak więc próbowałem ustawić OnClickListener, aby wykonać kliknięcie, oraz OnTouchListener, aby zaimplementować funkcję dotykową (MotionEvent.ACTION_DOWN), ale ta kombinacja nie działa, ponieważ OnTouchListener powoduje, że OnClickListener jest niefunkcjonalne (nie wiem dlaczego).

Na forach ludzie mówią, że możemy realizować OnClick przez OnTouch MotionEvent.ACTION_UP, ale ten może być wywołany z moim TextView układ (the TextView zamierzam klikać po naciśnięciu go i przeciągnąć palcem od niego uwolnić) i nie jest to pożądane zachowanie, ponieważ chcę:
kliknięcie = naciśnij + zwolnienie na TextView.

Czy ktoś może mi pomóc w rozwiązaniu tego problemu?

Odpowiedz

3

Adel, problem z pierwszym kliknięciem, czy w ogóle nie masz żadnego kliknięcia?

Ten problem występuje, jeśli masz wiele klikalnych układów, w których nie ma żadnych zdarzeń kliknięcia dla pierwszego. Dzieje się tak dlatego, że najpierw wybiera się go, a potem pojawia się zdarzenie click, spróbuj poniższego kodu.

private class CustomTouchListener implements OnTouchListener { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     TextView tv = (TextView) v.findViewById(R.id.single_line_text); 
     if (event.getAction() == MotionEvent.ACTION_DOWN) { 
      tv.setTextColor(COLOR_WHEN_PRESSED); 
     } else if (event.getAction() == MotionEvent.ACTION_UP) { 
      tv.setTextColor(COLOR_WHEN_RELEASED); 
      // Action of click goes here 
     } else if (event.getAction() == MotionEvent.ACTION_CANCEL) { 
      tv.setTextColor(COLOR_WHEN_RELEASED); 
          // To handle release outside the layout region 
     } 
     return false; 
    } 
} 

Działa to w mojej obecnej implementacji, jeśli ustawisz odbiornik dotyku dla swojego układu.

Należy również ustawić poniższego układu

android:focusable="true" 
android:focusableInTouchMode="true" 
android:clickable="true" 

Nadzieja to pomaga !!!

EDYCJA: Dodatkowo powinna być flaga zarówno w GÓRĘ jak iw GÓRĘ. Ustaw w DÓŁ i sprawdź, czy jest ustawiony w GÓRĘ. Pozwoli to uniknąć usterki, w której użytkownik może dotknąć dowolnego miejsca na ekranie, a następnie najechać na tekst i zwolnić go.

+0

Wielkie dzięki! Zdecydowanie mi pomogłeś. Sztuką dla mnie było ustawienie trzech właściwości, które podałeś ... – harsimranb

+0

Dzięki za pomoc! Brakowało mi androida: focusable = "true" w moim TextView – Gatekeeper

21

możesz wywołać View.performClick(), gdy action_up. Mam nadzieję, że to pomoże.

your_txtView.setOnClickListener(new TextView.OnClickListener(){ 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

     } 
    }); 

    your_txtView.setOnTouchListener(new TextView.OnTouchListener(){ 
      @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if (MotionEvent.ACTION_DOWN == event.getAction()) { 

     } else if (MotionEvent.ACTION_UP == event.getAction()) { 
      v.performClick(); 
     } 

     return true; 
    } 
    }); 
+0

Miałem ten sam problem ... i v.performClick działa pięknie ... to jest rozwiązanie ... proszę przyjąć odpowiedź –

+0

+1, to właśnie Szukałem. – tokudu

+0

Dziękuję Sven. To jest niesamowite. – aNoviceGuy

2

Miał ten sam problem. Rozwiązano, zwracając wartość false z ACTION_MOVE. Walczę z tym od kilku godzin, próbując różnych rzeczy, ale wydaje mi się, że wciąż nie oglądałem tego małego problemu ... A teraz ma to sens. Gdy zwrócisz wartość true od onTouch, dalsze przetwarzanie jest zatrzymywane, tak że OnClickListener nie jest świadomy żadnych ruchów i wyzwalaczy onClick nawet po tym, jak wskaźnik został przeniesiony poza obszar widoku.

+0

W imieniu @ bugs99, który nie może dodać komentarza z powodu braku reputacji: Zmieniając "return true' na" return false', możesz wykonać akcję 'onTouchListener()', a następnie przekazać zdarzenie dotyku do 'onClickListener()'.Dzięki temu nie ma potrzeby jawnego wykonywania 'performClick()' – gturri

Powiązane problemy