2016-05-16 5 views
1

Ist es möglich, mehrere Schaltflächen aufrufen die gleiche Methode? Ich meine die Parameter wären die ID des Buttons. Mein Problem ist, dass ich eine wirklich, sehr lange Switch Case Funktion habe und jeder Fall die gleichen Methoden hat. Hier ist mein Code-Schnipsel (ich habe es verkürzt):Android-Button: OnClick-Methode kürzen

public class HerkunftRind extends Activity implements View.OnClickListener, Animator.AnimatorListener { 

private static final String TAG = "HerkunftRind"; 
ViewFlipper viewFlipper; 
ImageButton myButton; 

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

    viewFlipper = (ViewFlipper) findViewById(R.id.herkunft_rinder_view_flipper); 

    ImageButton imageButton = null; 
    imageButton = (ImageButton) findViewById(R.id.button_1); 
    imageButton.setOnClickListener(this); 
    imageButton = (ImageButton) findViewById(R.id.button_2); 
    imageButton.setOnClickListener(this); 
    imageButton = (ImageButton) findViewById(R.id.button_3); 
    imageButton.setOnClickListener(this); 
    imageButton = (ImageButton) findViewById(R.id.button_4); 
    imageButton.setOnClickListener(this); 
    } 
public void setAnimationFade(int id) { 
    myButton = (ImageButton) findViewById(id); 
    ObjectAnimator animator = ObjectAnimator.ofFloat(myButton, View.ALPHA, 0.5f, 1f); 
    animator.setDuration(300); //ms 
    animator.start(); 
    animator.addListener(this); 
} 
@Override 
public void onAnimationStart(Animator animation) { 
    myButton.setAlpha(1f); 
} 

@Override 
public void onClick(View v) { 
    switch (v.getId()) { 
     case R.id.button_1: { 
      setAnimationFade(R.id.button_1); 
      text = (TextView) findViewById(R.id.button_1_text_1); 
      text.setVisibility(View.VISIBLE); 
      text = (TextView) findViewById(R.id.button_1_text_2); 
      text.setVisibility(View.VISIBLE); 
      break; 
     } 
     case R.id.button_2: { 
      setAnimationFade(R.id.button_2); 
      text = (TextView) findViewById(R.id.button_2_text_1); 
      text.setVisibility(View.VISIBLE); 
      text = (TextView) findViewById(R.id.button_2_text_2); 
      text.setVisibility(View.VISIBLE); 
      break; 
     } 
     case R.id.button_3: { 
      setAnimationFade(R.id.button_3); 
      text = (TextView) findViewById(R.id.button_3_text_1); 
      text.setVisibility(View.VISIBLE); 
      text = (TextView) findViewById(R.id.button_3_text_2); 
      text.setVisibility(View.VISIBLE); 
      break; 
     } 
     case R.id.button_4: { 
      setAnimationFade(R.id.button_4); 
      text = (TextView) findViewById(R.id.button_4_text_1); 
      text.setVisibility(View.VISIBLE); 
      text = (TextView) findViewById(R.id.button_4_text_2); 
      text.setVisibility(View.VISIBLE); 
      break; 
     } 

Was ich will nicht wissen, ist es zu definieren, direkt in der XML-Datei. Kann ich das kürzer machen?

Antwort

2

Ja, Sie können, ich persönlich mache das sehr oft.
Sie können die Methode im XML-Layout aufrufen.

dh:

<Button 
    android:onClick="myMethod()" 
/> 

Kenntnis, dass sich myMethod()Muss haben eine Signatur wie

public void myMethod(View v) 

Innen myMethod Sie dann die ist die Ansicht, die Sie geklickt haben (was auch erkennen, möchten können sei heterogen) und folge konsequent.

Fügen Sie einfach switch() hinzu, wobei Sie v.getId() verwenden, um zu bestimmen, welche Ansicht das Ereignis ausgelöst hat.

Etwas wie folgt aus:

switch(v.getId()) 
{ 
    case R.id.txtPhone: 
    { 
     // Do something 
     // ... 
     break; 
    } 
    case R.id.txtMenu: 
    { 
     // Show options menu 
     // ... 
     break; 
    } 
    // ... 
    default: 
    { 
     break; 
    } 
} 
+0

Was ich denke, ist OP will den Code in 'Schalter()' Fälle reduzieren. –

+0

Ja das ist korrekt! Die Sache ist, dass ich den onClick im XML nicht definieren möchte. – schuetzi

+0

... und ** warum **? –

1

hier ist dies ein wenig redundant:

public void onClick(View v) { 
    switch (v.getId()) { 
     case R.id.button_1: { 
      setAnimationFade(R.id.button_1); 
      text = (TextView) findViewById(R.id.button_1_text_1); 
      text.setVisibility(View.VISIBLE); 
      text = (TextView) findViewById(R.id.button_1_text_2); 
      text.setVisibility(View.VISIBLE); 
      break; 
     } 
     case R.id.herkunft_rinder_bauer2_button: { 
      setAnimationFade(R.id.button_2); 
      text = (TextView) findViewById(R.id.button_2_text_1); 
      text.setVisibility(View.VISIBLE); 
      text = (TextView) findViewById(R.id.button_2_text_2); 
      text.setVisibility(View.VISIBLE); 
      break; 
     } 
... 

warum Sie nicht setAnimationFade nur anrufen, bevor das Loch Schaltergehäuse .. ??

public void onClick(View v) { 
     setAnimationFade(v.getId()); 
     switch (v.getId()) { 
      case R.id.button_1: { 
       setAnimationFade(R.id.button_1 
+0

Jedes Mal, wenn die ID der Schaltfläche 'R.id.button_X' geändert wird. –

+0

Ich habe ungefähr 20 Bilder in einer Galerie und wenn jemand sie berührt, sollte der Alpha-Wert von 0,5 auf 1 steigen und ein Text sollte über dem Bild erscheinen -> 20 Fälle in der onClick-Methode. Kann ich das kürzer machen? – schuetzi

1

Wenn Sie nicht über eine lange onClick Methode wollen, dann könnten Sie einen onClick Zuhörer jeder Taste schreiben.

Z. B:

button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

      } 
     }); 


anotherButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

      } 
     });