2013-05-16 4 views
5

Gibt es eine Möglichkeit, nur einen einzigen Tastendruck zu registrieren? Im Moment in meiner Tätigkeit habe ich zwei Knöpfe, die jeweils eine andere Aktivität starten - im Moment, wenn ich sie gleichzeitig drücke, beginnen beide Aktivitäten, eine über der anderen. Ich will das verhindern und habe nur den einen oder den anderen Lauf zu einem bestimmten Zeitpunkt. Ich dachte daran, Multitouch zu deaktivieren, aber das fühlt sich irgendwie hacky an.Halten Sie Benutzer davon ab, zwei Tasten gleichzeitig zu drücken?

EDIT: Ich habe versucht, dies zu tun:

public class MainActivity extends Activity { 

    Button btn_send; 
    Button btn_receive; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     btn_send = (Button) findViewById(R.id.btn_send); 
     btn_receive = (Button) findViewById(R.id.btn_receive); 
     OnClickListener listener = new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       if (v.equals(btn_send)) { 
        if (isWifiConnected()) { 
         btn_receive.setClickable(false); 
         startActivity(new Intent(MainActivity.this, 
           SendActivity.class)); 
        } else { 
         Toast.makeText(MainActivity.this, 
           "Wifi connection required", Toast.LENGTH_SHORT) 
           .show(); 
        } 
       } else if (v.equals(btn_receive)) { 
        if (isWifiConnected()) { 
         btn_send.setClickable(false); 
         startActivity(new Intent(MainActivity.this, 
           ReceiveActivity.class)); 
        } else { 
         Toast.makeText(MainActivity.this, 
           "Wifi connection required", Toast.LENGTH_SHORT) 
           .show(); 
        } 
       } 

      } 

     }; 
     btn_send.setOnClickListener(listener); 
     btn_receive.setOnClickListener(listener); 
    } 

    @Override 
    public void onPause() { 
     btn_send.setClickable(true); 
     btn_receive.setClickable(true); 
     super.onPause(); 
    } 
} 

ich zur gleichen Zeit auf meinem Galaxy S2 GT-i9100 beiden Tasten noch drücken kann.

+0

einmal Schaltfläche klicken, um die Taste deaktivieren oder unsichtbar machen – Raghunandan

+0

Nennen Sie 'startActivity' in' onClick' oder ist es zurückgestellt? –

Antwort

1

die gleichen onClickListener registrieren die Schaltfläche für beide und setEnabled (false) zu letzteren nennen, wenn die ehemaligen

+0

und rufen 'setEnabled (true)' in 'onPause' auf, falls der Benutzer zu dieser 'Aktivität' zurückkehrt. Eigentlich ist es nicht nötig einen einzigen 'onClickListener' zu verwenden. –

+0

Ich stimme zu, aber warum haben Sie mehr, wenn es nicht unbedingt benötigt wird? – Blackbelt

+0

Das ist eine persönliche Vorliebe. Ich mag keine 'ifs' oder' switches' und vermeide sie, wenn möglich, mit objektorientiertem Code. Natürlich, wenn das Sinn macht ... –

0

Verwendung desselben Klick listner angeklickt wurde. dh implementieren Sie onClickListner für die Klasse und button.setOnClickListner (this) für beide Schaltflächen.

0

In Ihrem gemeinsamen Onclick-Hörer

if(oneClick){ 
    oneClick = false; 
    //launch the activity 
} 

, und setzen Sie die Flagge in onPause, oder wo auch immer angemessen.

+0

Ich habe das auch versucht, keine Würfel. – Logan

0

Versuchen Sie, diese

button1.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 

       button2.setClickable(false); 

       //launch first activity 
      } 
     }); 

button2.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 

       button1.setClickable(false); 

       //launch second activity 
      } 
     }); 
1

Zunächst einmal eine Klasse erstellen Berührungsereignisse zu handhaben, wie die folgende Liste:

public class SingleClickTouchListener implements OnTouchListener { 
    private boolean mOneViewClicked = false; 

    /** 
    * Holds the clicked view. Only allow click in other views when this view is no longer clicked. 
    */ 
    private Object mClickedView = null; 

    @Override 
    public boolean onTouch(View view, MotionEvent motionEvt) { 
     boolean consumed = false; 

     switch (motionEvt.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      if (!mOneViewClicked) { 
       mClickedView = view; 
       mOneViewClicked = true; 
      } else { 
       consumed = true; 
      } 
      break; 
     case MotionEvent.ACTION_UP: 
      if (mClickedView == view) { 
       mOneViewClicked = false; 
       consumed = false; 
      } else { 
       consumed = true; 
      } 
      break; 
     default: 
      // No action required. 
      break; 
     } 

     return consumed; 
    } 
} 

Dann eine Instanz dieser Klasse erstellen:

private SingleClickTouchListener mSingleClickTouchListener = new SingleClickTouchListener(); 

Und übergeben Sie die gleiche Instanz nun an alle Ansichten (oder Schaltflächen), die nicht gleichzeitig gedrückt werden sollen.

view1.setOnTouchListener(mSingleClickTouchListener); 
view2.setOnTouchListener(mSingleClickTouchListener); 
view3.setOnTouchListener(mSingleClickTouchListener); 
1

Dieser arbeitete für mich

boolean hasRunOnce = false; 
ImageButton clickExample1, clickExample2; 

    clickExample1 = (ImageButton) findViewById(R.id.btnExample1); 
    clickExample1.setOnClickListener(this); 

    clickExample2 = (ImageButton) findViewById(R.id.btnExample2); 
    clickExample2.setOnClickListener(this); 


} 

@Override 
public void onClick(View v) { 


    if (hasRunOnce == false) { 
     hasRunOnce = true; //Stop users clicking buttons simultaneously 

     switch (v.getId()) { 
     case R.id.btnExample1: 
      //do stuff 
      break; 
     case R.id.btnExample2: 
      //do stuff 
      break; 

     } 
    } 
} 



@Override 
protected void onResume() { 
    hasRunOnce = false; 

    super.onResume(); 
} 

}

7

android: splitMotionEvents = "false" für Inhaber von Tasten