2013-05-16 10 views
5

Czy istnieje sposób na zarejestrowanie tylko jednego naciśnięcia przycisku? W tej chwili w mojej działalności mam dwa przyciski, z których każdy rozpoczyna inną czynność - w tej chwili, jeśli jednocześnie ich naciskam, obie czynności rozpoczynają się jedna nad drugą. Chcę temu zapobiec i mieć tylko jedno LUB drugie działanie w danym momencie. Myślałem o wyłączeniu multitouch, ale to dla mnie trochę hacky.Zatrzymać użytkowników od naciśnięcia dwóch przycisków naraz?

EDIT: Próbowałem to zrobić:

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(); 
    } 
} 

mogę jeszcze wcisnąć oba przyciski jednocześnie na moim Galaxy S2 GT-i9100.

+0

raz przycisk to kliknąć Możesz wyłączyć przycisk lub uczynić go niewidzialnym – Raghunandan

+0

Czy nazywasz 'startActivity' wewnątrz' onClick' lub czy jest on odroczony? –

Odpowiedz

1

zarejestrować tę samą onClickListener zarówno dla przycisku i nazywają setEnabled (false) do tego ostatniego, gdy dawny został wciśnięty

+0

i wywołaj 'setEnabled (true)' w 'onPause' na wypadek, gdyby użytkownik powrócił do tego' Activity'. Faktycznie użycie pojedynczego 'onClickListener' nie jest potrzebne. –

+0

Zgadzam się, ale dlaczego mam więcej, jeśli nie jest to absolutnie potrzebne? – Blackbelt

+0

To jest osobiste preferencje. Nie lubię 'ifs' lub' switch' i unikaj ich, jeśli to możliwe, używając kodu zorientowanego obiektowo. Oczywiście, kiedy to ma sens ... –

0

wykorzystanie samo kliknięcie listner. tj. Zaimplementuj onClickListner dla klasy i button.setOnClickListner (this) dla obu przycisków.

0

Wewnątrz wspólnego onclick-słuchacza

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

i wyzerować flagę w OnPause, lub tam, gdzie to właściwe.

+0

Próbowałem tego również, bez kości. – Logan

0

Spróbuj

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

Przede wszystkim, należy utworzyć klasę do obsługi dotykowych wydarzenia, jak poniżej:

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; 
    } 
} 

Następnie należy utworzyć instancję tej klasy:

private SingleClickTouchListener mSingleClickTouchListener = new SingleClickTouchListener(); 

A teraz przekaż tę samą instancję do wszystkich widoków (lub przycisków), na które nie chcesz pozwolić, aby były jednocześnie naciskane.

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

Ten pracował dla mnie

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" dla posiadacza przycisków

Powiązane problemy