2017-10-13 1 views
1

Sagen wir, ich habe ein paar Tasten und ihr Klicken wird von einem gemeinsamen Handler behandelt gibt es eine Möglichkeit, den Hörer einmal zu definieren und kein onClick Attribut für jede Taste zu definieren?Delegate (common) Klick Listener in Android

<Button android:onClick="handler" /> 

Vielleicht Eltern Delegation wie in Browsern oder einem Abfangjäger ..... stellen Sie sich 50 Tasten haben, erklären Sie für jede explizit auf Klick ???

+0

Verwenden Sie onClick (View v) Methode –

+0

Sie können den gleichen Click-Handler für alle Ihre Schaltflächen geben und dann in OnClick() -Methode, verwenden Sie Switch Case für verschiedene Operationen. –

Antwort

1

Hier ist, was ich kam schließlich als Lösung funktioniert es nur mit touchables zum Beispiel TextView ist kein berührbaren:

in Java:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    final MainActivity activity = this; 
    /* Any kind of ViewGroup that is 
     parent of the common listener views. In the example it is the rootView */ 
    View rootView = this.getWindow().getDecorView().getRootView(); 

    // Buttons are touchables 
    ArrayList<View> touchables = rootView.getTouchables(); 

    // Define the common on click listener for the buttons 
    View.OnClickListener listener = new View.OnClickListener() { 
     public final void onClick(View view) { 
      activity.onBtnClick((Button) view); 
     } 
    }; 

    // Iterate trough touchables and if the View is a button assign the listener 
    for (View v: touchables) { 
     // TODO: omit button if that common listener isn't meant for it 
     if(v instanceof Button) { 
      v.setOnClickListener(listener); 
     } 
    } 
} 

// The listener callback 
protected final void onBtnClick(Button btn) { 
    String btnStringId = btn.getResources().getResourceEntryName(btn.getId()); 
} 

in Kotlin:

override fun onCreate(savedInstanceState: Bundle?) { 
    super.onCreate(savedInstanceState) 
    setContentView(R.layout.activity_main) 

    /* Any kind of ViewGroup that is 
     parent of the common listener views. In the example it is the rootView */ 
    val rootView = window.decorView.rootView 
    val touchables = rootView.touchables 
    val listener = View.OnClickListener { 
     onBtnClick(it as Button) 
    } 
    touchables.forEach { if (it is Button) { 
     it.setOnClickListener(listener) 
    }} 
} 

protected fun onBtnClick(btn: Button) { 
    var btnStringId = btn.getResources().getResourceEntryName(btn.id) 
} 
2

Der beste Weg: Sie Ihre Aktivität View.OnClickListener implementieren lassen, und schreiben Sie Ihre onClick Methode wie folgt:

public void onClick(View v) { 
    final int id = v.getId(); 
    switch (id) { 
    case R.id.button1: 
     // your code for button1 here 
     break; 
    case R.id.button2: 
     // your code for button2 here 
     break; 
    // even more buttons here 
    } 
} 

in Ihrer XML-Layout-Datei Dann können Sie die Klick Zuhörer direkt mit dem android:onClick: Attribut

<Button 
    android:id="@+id/button1" 
    android:onClick="onClick" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Button 1" /> 
+0

Aber das ist es, was ich vermeiden will, 'onClick' für jede Schaltfläche explizit zu deklarieren .... –

+0

okay, dann versuche einen gemeinsamen onClickListener. Weisen Sie diesen Listener Ihren Tasten zu. –

1

Ja, es kann auf Aktivitätsebene programmgesteuert erreicht werden. Daher müssen Sie das Attribut "onClick" in XML nicht definieren.

Sie definieren eine View.OnClickListener-Klasse. Für z.B.

View.OnClickListener buttonListener = new View.OnClickListener() { 
     public void onClick(View v) { 
      // here you can define different code for different buttons 
     }; 

dann legen Sie diesen Hörer auf alle Ihre Tasten an einem Ort

final Button button = findViewById(R.id.button_id); 
    button.setOnClickListener(buttonListener); 
1

Ja, Sie dies tun können.

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 

import java.util.ArrayList; 
import java.util.List; 

public class MainActivity extends AppCompatActivity { 
List<Button> buttons; 
ViewGroup parentView; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    buttons = new ArrayList<>(); 
    parentView = (ViewGroup) findViewById(R.id.cord); 


    //Replace the above line with the container view i.e. 
    //Replace parentView = (ViewGroup) findViewById(R.id.cord); 
    // With parentView = (ViewGroup) findViewById(R.id.<YOUR MAIN VIEW/PARENT CONTAINER>); 
    //R.id.cord is R.id.<YOUR MAIN VIEW/PARENT CONTAINER> for me because my Relative Layout 
    // container's name is cord. 


    for(int i=0; i < parentView.getChildCount(); i++) { 

     childView = parentView.getChildAt(i); 
     //The if may change there are other options try them too. 
     if(childView.getClass().getName().substring(35).equals("Button")){ 


      buttons.add((Button)parentView.getChildAt(i)); 
     } 
     /* 
     //Else part optional 
     //Remove comment to use 
     else 
      Log.e("Not","A Button");*/ 
    } 

    for (int i =0;i<buttons.size();i++){ 
     buttons.get(i).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       //Do the work here 
       Log.d("Button Clicked",Integer.toString(view.getId())); 
      } 
     }); 
    } 





    } 
} 

Dies ist eine Möglichkeit, dass Sie Ihr Problem lösen können ...

+0

Wenn Sie wissen, wie viele Schaltflächen Sie verwenden können, können Sie Array statt List verwenden. –

Verwandte Themen