2012-03-14 13 views
5

Jestem początkującym android, podczas ustawiania onclick słuchacza do przycisku, co robi parametr przekazany na myśli:Android setOnclicklistener parametr

btn1.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

     } 
    });  

więc „nowy OnClickListener()”, jest on przekazywany do metody czy to nie powinno być przedmiotem?
jeśli to nie jest obiekt; to jak używamy słowa kluczowego "nowy"?
dlaczego "onclick()" jest wywoływane bezpośrednio bez użycia słowa kluczowego "this" lub jego nazwy klasy.

+0

Hi odo mijamy obiekt jako argument. Zasadniczo tworzymy wewnętrzną klasę, która nadpisuje metodę onClick. –

Odpowiedz

0

OnClickListener()

jest interfejsem. Za pomocą nowego słowa kluczowego deklarujesz nowy obiekt anonimowej klasy wewnętrznej, która zaimplementuje interfejs. Że s bazowy pytanie do

java

niż android. Należy rozważyć czytanie o

interfejs Java

12

OnClickListener jest interface i za pomocą new OnClickListener() jako parametr dla btn1.setOnClickListener jest faktycznie tworzenia Anonymous Inner Class który implementuje OnClickListener . A metoda onClick musi zostać zadeklarowana, ponieważ jest to metoda abstrakcyjna wewnątrz tej klasy interfejsu. Każdy kod, który napiszesz wewnątrz onClick, zostanie wykonany po naciśnięciu przycisku.


Aktualizacja

zrobić to za pomocą Anonymous wewnętrzną klasę w obiekcie:

//declaring OnClickListener as an object 
private OnClickListener btnClick = new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 

    } 
}; 

//passing listener object to button 
btn1.setOnClickListener(btnClick); 

to zrobić bez użycia klasa Anonymous:

public class YourActivity extends Activity implements OnClickListener { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     Button b = new Button(this); 

     //setting listener to button 
     b.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 

    } 
} 

Jedyna różnica pomiędzy tymi podejściami jest, jeśli twój przycisk zawiera kliknięcie kod zdarzenia, który ma być ważny/dostępny tylko dla tego przycisku, możesz użyć wewnętrznej klasy, tak jak robisz w swoim kodzie (ponieważ jest to łatwe do zrobienia od razu). Jeśli jednak istnieje wiele przycisków wymagających wykonania tego samego kodu w zdarzeniu onClick, możesz zdefiniować detektor jako obiekt i przekazać go do niego.

+0

Czy istnieje sposób dodania odbiornika onlcick innego niż klasy anonimowe? czy mogę zadeklarować go poza podpisem metody i tylko przekazać obiekt? daj mi proszę próbkę kodu. –

+0

tak, oczywiście. sprawdź moją zaktualizowaną odpowiedź – waqaslam

+0

Nadal, anonimowa wewnętrzna klasa :) –

0

OnClickListener to interfejs. Oznacza to, że jeśli ustawisz ją w linii, utworzyłeś anonimową klasę, która właśnie implikuje interfejs wewnątrz metody ustawionej.

Jeśli chcesz utworzyć klasę OnClick.Można by zrobić coś takiego:

class OnButtonClick implements OnClickListener{ 

    public void onClick(View v) { 
     // TODO Auto-generated method stub 
    } 

} 

Następnie można użyć:

OnButtonClick obc = new OnButtonClick(); 
textView.setOnClickListener(obc); 

To więcej Java niż android przeczytasz Interfejsy i klasy wewnętrzne

1

definicja interfejsu dla zwrotna być wywoływane po kliknięciu widoku.

streszczenie void onClick (View v) Wywoływane po kliknięciu widoku.

2

Aby utworzyć instancję obiektu interfejsu lub klasy abstrakcyjnej, należy zastąpić wszystkie nie zaimplementowane metody (metody abstrakcyjne). Możesz zastąpić metody abstrakcyjne, używając anonimowej klasy lub definiując klasę, która rozszerza klasę abstrakcyjną/implementuje interfejs i zastępuje abstrakcyjne metody. Jednak, aby uczynić go bardziej zrozumiałym, można zrobić to tak:

OnClickListener l = new OnClickListener() 
{ 
    @Override 
    public void onClick(View v) 
    { 
     // TODO Auto-generated method stub 
    } 
}); 
btn1.setOnClickListener(l); 

i stosować oddzielną klasę, można zrobić to tak:

btn1.setOnClickListener(new MyOwnListener()); 

// ... 

public class MyOwnListener implements OnClickListener 
{ 
    // ... 

    @Override 
    public void onClick(View v) 
    { 
     // TODO Auto-generated method stub 
    } 
} 
Powiązane problemy