2015-04-06 19 views
21

Moje zrozumienie jest, gdy tworzę obiekt przycisk, który nasłuchuje za kliknięcie muszę:setOnclickListener vs OnClickListener vs View.OnClickListener

  1. utworzyć obiekt przycisk
  2. użycie OnClickListner aby posłuchać kliknięcie użytkownika
  3. użycie onClick do wykonywania działań, gdy użytkownik kliknie przycisk

teraz

  • dokąd zmierza setOnClickListener do powyższej logiki?
  • Który z nich faktycznie słucha kliknięcia przycisku?
  • setOnclickListener?
  • ONclickListener?
  • View.OnClickListener?
  • jakie są różnice między tymi 3?

Oto co znalazłem w Android Dev:

The example below shows how to register an on-click listener for a Button. 

// Create an anonymous implementation of OnClickListener 
private OnClickListener mCorkyListener = new OnClickListener() { 
    public void onClick(View v) { 
     // do something when the button is clicked 
    } 
}; 

protected void onCreate(Bundle savedValues) { 
    ... 
    // Capture our button from layout 
    Button button = (Button)findViewById(R.id.corky); 
    // Register the onClick listener with the implementation above 
    button.setOnClickListener(mCorkyListener); 
    ... 
} 

Można również stwierdzić, że bardziej wygodne do wdrożenia OnClickListener jako część swojej działalności. Pozwoli to uniknąć dodatkowego obciążenia klasy i przydzielania obiektów. Na przykład:

public class ExampleActivity extends Activity implements OnClickListener { 
    protected void onCreate(Bundle savedValues) { 
     ... 
     Button button = (Button)findViewById(R.id.corky); 
     button.setOnClickListener(this); 
    } 

    // Implement the OnClickListener callback 
    public void onClick(View v) { 
     // do something when the button is clicked 
    } 
} 

Odpowiedz

16

Logika jest prosta. setOnClickListener należący do kroku 2.

  1. utworzyć przycisk
  2. utworzyć instancję OnClickListener * jak to się robi w tym przykładzie i zastąpić onClick -method.
  3. Przypisuje się temu OnClickListener temu przyciskowi przy użyciu btn.setOnClickListener(myOnClickListener); w swoim fragmencie/działalności onCreate-metoda.
  4. Po kliknięciu przycisku zostanie wywołana funkcja onClick przypisanego OnClickListener.

* Jeśli używasz import android.view.View;, używasz View.OnClickListener. Jeśli używasz import android.view.View.*; lub import android.view.View.OnClickListener;, używasz OnClickListener, o ile go otrzymam.

Innym sposobem jest pozwolić ci aktywność/fragment dziedziczyć po OnClickListener. W ten sposób przypiszesz fragment/działanie jako detektor dla swojego przycisku i zaimplementujesz onClick jako funkcję-członka.

2
  1. Przede wszystkim, nie ma różnicy między View.OnClickListener i OnClickListener. Jeśli po prostu użyjesz bezpośrednio nazwy View.OnClickListener, nie musisz wpisywać -

    importować android.view.View.OnClickListener

  2. Ustawiasz instancję OnClickListener (np. myListener nazwany obiekt) jako detektora do widoku przez setOnclickListener(). Po wywołaniu zdarzenia click ta myListener otrzymuje powiadomienie i wywoływana jest metoda. To miejsce, w którym wykonujemy własne zadanie. Mam nadzieję, że to ci pomoże.

37

Wyobraźmy sobie, że mamy 3 przyciski na przykład

public class MainActivity extends ActionBarActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main); 


     // Capture our button from layout 
     Button button = (Button)findViewById(R.id.corky); 
     Button button2 = (Button)findViewById(R.id.corky2); 
     Button button3 = (Button)findViewById(R.id.corky3); 
     // Register the onClick listener with the implementation above 
     button.setOnClickListener(mCorkyListener); 
     button2.setOnClickListener(mCorkyListener); 
     button3.setOnClickListener(mCorkyListener); 

    } 

    // Create an anonymous implementation of OnClickListener 
    private View.OnClickListener mCorkyListener = new View.OnClickListener() { 
     public void onClick(View v) { 
      // do something when the button is clicked 
      // Yes we will handle click here but which button clicked??? We don't know 

     } 
    }; 

} 

Więc co zrobimy?

public class MainActivity extends ActionBarActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main); 


     // Capture our button from layout 
     Button button = (Button)findViewById(R.id.corky); 
     Button button2 = (Button)findViewById(R.id.corky2); 
     Button button3 = (Button)findViewById(R.id.corky3); 
     // Register the onClick listener with the implementation above 
     button.setOnClickListener(mCorkyListener); 
     button2.setOnClickListener(mCorkyListener); 
     button3.setOnClickListener(mCorkyListener); 

    } 

    // Create an anonymous implementation of OnClickListener 
    private View.OnClickListener mCorkyListener = new View.OnClickListener() { 
     public void onClick(View v) { 
      // do something when the button is clicked 
      // Yes we will handle click here but which button clicked??? We don't know 

      // So we will make 
      switch (v.getId() /*to get clicked view id**/) { 
       case R.id.corky: 

        // do something when the corky is clicked 

        break; 
       case R.id.corky2: 

        // do something when the corky2 is clicked 

        break; 
       case R.id.corky3: 

        // do something when the corky3 is clicked 

        break; 
       default: 
        break; 
      } 
     } 
    }; 

} 

Albo możemy to zrobić:

public class MainActivity extends ActionBarActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main); 


     // Capture our button from layout 
     Button button = (Button)findViewById(R.id.corky); 
     Button button2 = (Button)findViewById(R.id.corky2); 
     Button button3 = (Button)findViewById(R.id.corky3); 
     // Register the onClick listener with the implementation above 
     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // do something when the corky is clicked 
      } 
     }); 
     button2.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // do something when the corky2 is clicked 
      } 
     }); 
     button3.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // do something when the corky3 is clicked 
      } 
     }); 

    } 

} 

Albo możemy realizować View.OnClickListener i myślę, że to najlepszy sposób:

public class MainActivity extends ActionBarActivity implements View.OnClickListener { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main); 


     // Capture our button from layout 
     Button button = (Button)findViewById(R.id.corky); 
     Button button2 = (Button)findViewById(R.id.corky2); 
     Button button3 = (Button)findViewById(R.id.corky3); 
     // Register the onClick listener with the implementation above 
     button.setOnClickListener(this); 
     button2.setOnClickListener(this); 
     button3.setOnClickListener(this); 

    } 

    @Override 
    public void onClick(View v) { 
     // do something when the button is clicked 
     // Yes we will handle click here but which button clicked??? We don't know 

     // So we will make 
     switch (v.getId() /*to get clicked view id**/) { 
      case R.id.corky: 

       // do something when the corky is clicked 

       break; 
      case R.id.corky2: 

       // do something when the corky2 is clicked 

       break; 
      case R.id.corky3: 

       // do something when the corky3 is clicked 

       break; 
      default: 
       break; 
     } 
    } 
} 

Wreszcie istnieją żadne realne różnice tu tylko "O wiele lepiej niż inne"

+0

Czy druga metoda nie byłaby lepsza od innych? Pierwszy i trzeci sposób, abyś najpierw zorientował się, który widok został kliknięty, a następnie nad nim działasz, podczas gdy drugi sposób możesz wskoczyć do niego. Ciekawe, co mówią inni, bo szczerze mówiąc nie jestem w 100% pewien, czy moja logika jest poprawna, czy nie. – CodyEngel

+1

@HuskyHuskie. Wiedz, kiedy należy przejmować się wydajnością, a kiedy nie. Zadaj sobie pytanie: Jak często klika użytkownik? Jaki jest dopuszczalny czas reakcji, gdy użytkownik kliknie? Ile miliona instrukcji java na sekundę wykonuje moje urządzenie docelowe? Garstka instrukcji, które trzeba wykonać, aby dowiedzieć się, który widok jest tak znaczący? Weź również pod uwagę pracę, którą wykonasz, aby obsłużyć kliknięcie. Zliczanie kodu w systemie operacyjnym, które będzie zawierało tysiące, dziesiątki tysięcy, a może setki tysięcy instrukcji java. Myślę, że widzisz, dokąd to zmierza ... – ToolmakerSteve

+0

czy można ich użyć, mam na myśli nie tylko "implementuje View.OnClickListener", ale także "SetOnClickListener" – Patzu

2

Widok jest nadklasa dla wszystkich widżetów i interfejs OnClickListener należy do tej klasy. Wszystkie widgety dziedziczą to. View.OnClickListener jest taki sam jak OnClickListener. Musiałbyś zastąpić metodę onClick (View view) z tego słuchacza, aby uzyskać pożądaną akcję dla twojego przycisku.

Aby powiedzieć Android słuchać kliknij zdarzeń dla widgetu, trzeba zrobić:

widget.setOnClickListener(this); // If the containing class implements the interface 
// Or you can do the following to set it for each widget individually 
widget.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     // Do something here 
    } 
}); 

„Widok” parametr przekazany w onClick() metoda po prostu pozwala Android wiedzieć, że pogląd został wciśnięty . Może to być Button lub TextView lub coś innego. Od Ciebie zależy ustawienie OnClickListener dla każdego widżetu lub po prostu uczynienie klasy zawierającej wszystkie te widgety implementacją interfejsu. W tym przypadku będziesz mieć wspólną metodę onClick() dla wszystkich widżetów i wszystko, co musisz zrobić, to sprawdzić identyfikator widoku, który jest przekazywany do metody, a następnie dopasować go do identyfikatora dla każdego elementu, który chcesz i podejmij działania dla tego elementu.

4

Należy pamiętać, że dla uproszczenia, jakie odniósł się do tylko pierwszy fragment kodu tj

// Create an anonymous implementation of OnClickListener 
private OnClickListener mCorkyListener = new OnClickListener() { 
    public void onClick(View v) { 
     // do something when the button is clicked 
    } 
}; 

protected void onCreate(Bundle savedValues) { 
    ... 
    // Capture our button from layout 
    Button button = (Button)findViewById(R.id.corky); 
    // Register the onClick listener with the implementation above 
    button.setOnClickListener(mCorkyListener); 
    ... 
} 

setOnClickListener(View.OnClickListener l) jest metoda publiczna View klasie. Klasa button rozszerza klasę View i dlatego może wywołać metodę setOnClickListener(View.OnClickListener l).

setOnClickListener rejestruje wywołanie zwrotne do wywołania po kliknięciu widoku (przycisk w twoim przypadku). Ta odpowiedź powinna odpowiedzieć na twoje pierwsze dwa pytania:

1. Gdzie pasuje setOnClickListener do powyższej logiki?

Ans. Rejestruje wywołanie zwrotne po kliknięciu przycisku. (Wyjaśniono szczegółowo w następnym akapicie).

2. Który z nich rzeczywiście słucha kliknięcia przycisku?

Ans. setOnClickListener to metoda, która faktycznie nasłuchuje kliknięcia przycisku.

Kiedy mówię, że rejestruje wywołanie zwrotne, mam na myśli to, że uruchomi on View.OnClickListener l, który jest parametrem wejściowym dla tej metody. W twoim przypadku, to będzie mCorkyListener wspomniano w button.setOnClickListener(mCorkyListener); które następnie wykonać metodę onClick(View v) wymieniony w ciągu

// Create an anonymous implementation of OnClickListener 
private OnClickListener mCorkyListener = new OnClickListener() { 
    public void onClick(View v) { 
     // do something when the button is clicked 
    } 
}; 

Przechodząc dalej, OnClickListener jest definicja interfejsu dla zwrotna powoływać gdy widok (przycisk w przypadku) został kliknięty. Mówiąc po prostu, po kliknięciu tego przycisku zostaną wykonane metody z zakresu mCorkyListener (ponieważ jest to implementacja OnClickListener). Ale, OnClickListener ma tylko jedną metodę, która jest OnClick(View v). Dlatego wszelkie działania, które należy wykonać po kliknięciu przycisku, muszą być kodowane w ramach tej metody.

Teraz, gdy wiesz, co oznacza setOnClickListener i OnClickListener, jestem pewien, że będziesz w stanie odróżnić te dwie osoby. Trzeci termin View.OnClickListener jest w rzeczywistości sam w sobie OnClickListener. Jedynym powodem, dla którego masz przed sobą View., jest różnica w ustawieniu import na początku programu. Jeśli masz tylko import android.view.View; jako instrukcję importu, będziesz musiał użyć View.OnClickListener. Jeśli wspomnisz jedną z tych instrukcji importowania: import android.view.View.*; lub import android.view.View.OnClickListener; możesz pominąć View. i po prostu użyć OnClickListener.