2013-07-25 7 views
6

Ich versuche zu sehen, ob es eine Möglichkeit gibt, eine einzige Methode zu erstellen, um einen Touch-Listener für mehrere Schaltflächen zu implementieren, da ich ziemlich viele Schaltflächen habe, die fast genau das tun gleiche Sache. Der einzige Unterschied in dem, was sie tun, ist die Nachricht, die sie über meine sendMessage() -Methode senden würden, und wie lange die Schaltfläche gedrückt werden muss, damit die Nachricht gesendet wird. Wenn es einen Weg gibt es zu tun, was könnte das sein? Und warum sollte so etwas nicht funktionieren?Eine Methode, um onTouchListener() für mehrere Schaltflächen zu implementieren

//Within onCreate Method... 
Button mButton = (Button) findViewbyId(R.id.three_sec_button); 
mButton = addTouchTimer(mButton, 3, 3); 

Calls -

private Button addTouchTimer(Button button, final int sec, final int messageNum){ 
     button.setOnTouchListener(new View.OnTouchListener() { 
      boolean longEnough = false; 
      long realTimeLeft = sec * 1000; 
      @Override 
      // This will make it so that a message is only sent if the button is held down for 3 seconds 
      // Otherwise it won't send. It is sent during the hold down process, releasing it returns a false 
      // value and no message is sent. 
      public boolean onTouch(View arg0, MotionEvent arg1) { 
       Log.d("Button", "Touchy Touchy!"); 
       if(arg1.getAction() == MotionEvent.ACTION_DOWN){ 
        buttonPressTime = new CountDownTimer(realTimeLeft, 1000){ 
         @Override 
         public void onTick(long millisUntilDone){ 
           realTimeLeft = millisUntilDone; 
         } 

         @Override 
         public void onFinish() { 
          long timeLeft = realTimeLeft; 
          long currTime = System.currentTimeMillis(); 
          long realFinishTime = currTime + timeLeft; 
           while(currTime < realFinishTime){ 
            currTime = System.currentTimeMillis(); 
           } 
          longEnough = true; 
          sendEmergencyMessage(longEnough, messageNum); 
         } 
        }.start(); 
       } 
       else if(arg1.getAction() == MotionEvent.ACTION_UP){ 
        buttonPressTime.cancel(); 
        sendMessage(longEnough, messageNum); 
       } 
       return longEnough; 
      }   
     }); 

     return button; 
    } 

Es scheint nur, dass es für die Effizienz willen ein besserer Weg, es zu tun, als die Umsetzung einzelne Zuhörer für jede Taste sein muss. Als Anmerkung enthält sendMessage() einen Log-Aufruf, der den booleschen Wert verwendet. Ich möchte sehen, wie er gesetzt wird, wenn er übergeben wird. Das ist der einzige Grund, warum es beim Loslassen der Taste aufgerufen wird.

Antwort

17

Ja, Sie haben Recht, es gibt einen besseren Weg. Ein einzelner TouchListener, der alles handhabt und bestimmt, welcher Knopf über die ID ist.

void intialization(){ 
    Button m1, m2, m3, m4; 
    ... //do initialization stuff 
    m1.setId(1); 
    m2.setId(2); 
    m3.setId(3); 
    m4.setId(4); 
    MyTouchListener touchListener = new MyTouchListener(); 
    m1.setOnTouchListener(touchListener); 
    m2.setOnTouchListener(touchListener); 
    m3.setOnTouchListener(touchListener); 
    m4.setOnTouchListener(touchListener); 
} 

public class MyTouchListener implements OnTouchListener { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     switch(v.getId()){ 
      case 1: 
       //do stuff for button 1 
       break; 
      case 2: 
       //do stuff for button 2 
       break; 
      case 3: 
       //do stuff for button 3 
       break; 
      case 4: 
       //do stuff for button 4 
       break; 
     } 
     return true; 
    } 

} 

Und so würden Sie es tun! Ein numerischer Ansatz für die IDs ist in diesem Fall sehr hilfreich. Ein anderer Ansatz besteht darin, dass Ihre Aktivität den OnTouchListener in Ihrer Aktivität implementiert, und dann wäre Ihr Code noch einfacher.

public class MyActivity extends Activity implements OnTouchListener { 

    void initialization(){ 
     Button m1, m2, m3, m4; 
     ... //do initialization stuff 
     m1.setId(1); 
     m2.setId(2); 
     m3.setId(3); 
     m4.setId(4); 
     m1.setOnTouchListener(this); 
     m2.setOnTouchListener(this); 
     m3.setOnTouchListener(this); 
     m4.setOnTouchListener(this); 
    } 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     switch(v.getId()){ 
      case 1: 
       //do stuff for button 1 
       break; 
      case 2: 
       //do stuff for button 2 
       break; 
      case 3: 
       //do stuff for button 3 
       break; 
      case 4: 
       //do stuff for button 4 
       break; 
     } 
     return true; 
    } 

} 

Hinweis: Dieser Ansatz auch funktioniert auch für OnClickListener, OnCheckedChangeListener oder einen anderen Zuhörer, die Sie auf einer Android-Ansicht verwenden würden.

+0

Mann, ich durch den Computer zu lange gesessen haben kann. Sollte das gewusst haben.Allerdings, Frage. Meinst du, ich sollte eine neue Klasse mit dem Namen MyTouchListener implementieren oder hast du das nur willkürlich hinzugefügt? Kann ich nicht einfach tun, was unten gesagt wurde, und es in meiner Hauptklasse implementieren und dann die onTouch-Methode wie "m1.setOnTouchListener (onTouch()); – zgc7009

+0

anrufen. Sie können Ihre Hauptaktivität implementieren Touch-Listener. Und können meine Antwort sehen – Chetna

+0

@ zgc7009: Wenn wir Ihr Problem gelöst haben, akzeptieren Sie bitte eins von ihnen als Antwort. Es wird für andere nützlich sein. – Chetna

4

Ja, es gibt einen besseren Ansatz, das Gleiche zu tun.
1) Machen Sie Ihre Klasse implementieren OnTouchListener.
2) Fügen Sie diesen Listener zu jeder Schaltfläche hinzu, die das Berührungsereignis behandeln soll. Wie folgt aus:

button1.setOnTouchListener(this); 

3) Und in dieser public boolean onTouch(View arg0, MotionEvent arg1) {});

Methode Schaltergehäuse auf der Ansicht verwenden kann, die berührt wurde. Das erste Argument, d.h. arg0, ist die Ansicht, auf die das Berührungsereignis gesendet wurde. In Ihrem Fall werden es andere Tasten sein. Etwas wie folgt aus:

public boolean onTouch(View arg0, MotionEvent arg1) { 
    if (arg1.getAction() == MotionEvent.ACTION_DOWN) { 
     switch (arg0.getId()) { 
     case R.id.button1: // Id of the button 
      // Your code goes here 
      break; 

     case R.id.button2: // Id of the button 
      // Your code goes here 
      break; 

     default: 
      break; 
     } 
    } 
    return true; 
} 
+1

Das funktioniert auch, ich habe Ihre mit der obigen Antwort gemischt und abgeglichen, insbesondere mit setId() getId(). Er war ein bisschen früher, also gab ich ihm den Scheck, aber das funktioniert auch gut. Wenn ich könnte, würde ich Ihnen beide Genehmigungsüberprüfungen geben. – zgc7009

+0

Das ist völlig in Ordnung :) – Chetna

1
OnTouchListener mOnTouchListener = new OnTouchListener() { 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     // Code goes here 
    return true; 
    } 
}; 

button1.setOnTouchListener(mOnTouchListener); 
button2.setOnTouchListener(mOnTouchListener); 
1

ich fusionieren zwei Antwort, dies ist mein Code

public class MyActivity extends Activity implements OnTouchListener { 
Button mGreen, mRed; 

void initialization() { 

    ... //do initialization stuff 

    mGreen.setOnTouchListener(this); 
    mRed.setOnTouchListener(this); 
} 

@Override 
public boolean onTouch(View v, MotionEvent event) { 


    switch (event.getAction() & MotionEvent.ACTION_MASK) { 
     case MotionEvent.ACTION_DOWN: 
      actionDown(); 
      break; 
     case MotionEvent.ACTION_UP: 
      actionUp(); 
      break; 

     case MotionEvent.ACTION_POINTER_DOWN: 
      break; 

     case MotionEvent.ACTION_POINTER_UP: 
      break; 

     case MotionEvent.ACTION_MOVE: 
      actionMove(); 
      break; 
    } 

    return true; 
} 

public void actionDown() { 
    switch (view.getId()) { 
     case R.id.button_green: 
      //todo 
      break; 

     case R.id.button_red: 
      //todo 
      break; 
    } 
} 

public void actionUp() { 
    switch (view.getId()) { 
     case R.id.button_green: 
      //todo 
      break; 


     case R.id.button_red: 
      //todo 
      break; 
    } 
} 

public void actionMove() { 
    switch (view.getId()) { 
     case R.id.button_green: 
      // todo 
      break; 

     case R.id.button_red: 
      // todo 
      break; 
    } 

}} 

Ich hoffe, dass dieser Code jemand

0

Warum Sie nicht verwenden helfen Buttermesser?

@Nullable @OnClick({R.id.btn1, R.id.btn2,R.id.btn3, R.id.btn4}) 
public void doStuff(Button button) {} 
+1

Es ist nicht onTouchEvent Listener –

+0

'@OnTouch (R.id.view_thing) öffentlichen boolean onTouch (View anzeigen, MotionEvent motionEvent) { }' –

5

Mit Buttermesser würde es so sein. (in meinem Fall Image als Schaltflächen)

@OnTouch({R.id.Button1, R.id.Button2, R.id.Button3}) 
public boolean buttonsTouched(ImageView button, MotionEvent event) { 
    switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      --(Your ACTION on Pressed)-- 
      return true; 
     case MotionEvent.ACTION_UP: 
      --(Your ACTION on Release)-- 
      return true; 
    } 
    return true; 
} 
Verwandte Themen