2013-05-16 36 views
5

Có cách nào để chỉ đăng ký một lần nhấn nút không? Hiện tại trong hoạt động của tôi, tôi có hai nút mà mỗi nút bắt đầu một hoạt động khác - tại thời điểm này nếu tôi nhấn chúng cùng một lúc, cả hai hoạt động bắt đầu, một hoạt động khác. Tôi muốn ngăn chặn điều này và chỉ có một OR khác đang chạy tại bất kỳ thời điểm nào. Tôi đã nghĩ đến việc vô hiệu hóa cảm ứng đa điểm nhưng điều đó lại khiến tôi cảm thấy khó chịu.Ngừng người dùng nhấn hai nút cùng một lúc?

EDIT: Tôi đã cố gắng để làm điều này:

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

tôi vẫn có thể bấm cả hai nút cùng lúc trên tôi Galaxy S2 GT-i9100.

+0

lần nút là nhấp chuột, bạn có thể vô hiệu hóa các nút hoặc làm cho nó vô hình – Raghunandan

+0

Bạn có gọi 'startActivity' bên trong' onClick' hoặc nó được hoãn lại không? –

Trả lời

1

đăng ký cùng onClickListener cho cả các nút và gọi setEnabled (false) để sau này khi trước đây đã được nhấp

+0

và gọi 'setEnabled (true)' trong 'onPause' trong trường hợp người dùng quay lại' Activity' này. Trên thực tế việc sử dụng một 'onClickListener' đơn là không cần thiết. –

+0

Tôi đồng ý, nhưng tại sao có nhiều hơn nếu nó không phải là cần thiết? – Blackbelt

+0

Đó là sở thích cá nhân. Tôi không thích 'ifs' hoặc' switches' và tránh chúng khi có thể bằng cách sử dụng mã hướng đối tượng. Tất nhiên khi điều đó có ý nghĩa ... –

0

sử dụng cùng một nhấp chuột listner. tức là, triển khai onClickListner cho lớp và button.setOnClickListner (this) cho cả hai nút.

0

Bên chung onclick-listener của bạn

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

, và đặt lại cờ trong onPause, hoặc bất cứ nơi nào thích hợp.

+0

Tôi đã thử điều này quá, không có xúc xắc. – Logan

0

Hãy thử điều này

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

Trước hết, tạo ra một lớp để xử lý các sự kiện liên lạc, giống như dưới đây:

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

Sau đó, tạo một thể hiện của lớp này:

private SingleClickTouchListener mSingleClickTouchListener = new SingleClickTouchListener(); 

Và bây giờ chuyển cùng một thể hiện cho tất cả các giao diện (hoặc các nút) mà bạn không muốn cho phép được nhấn đồng thời.

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

này làm việc cho tôi

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" cho người giữ nút

Các vấn đề liên quan