2011-11-30 25 views
5

Tôi bị ảnh hưởng bởi xử lý sự kiện lạ trong Android. Vấn đề của tôi là nếu người dùng nhấp chuột vào số Button nhiều lần thì sự kiện đó sẽ được xếp hàng đợi và chuyển tiếp đến Activity tiếp theo.Nhấp vào sự kiện được chuyển đến lần bắt đầu tiếp theo Hoạt động

Dưới đây là một ví dụ:

<Button 
    android:id="@+id/btn_home_show" 
    style="@style/main_buttons" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/home_label_show" /> 

ActivityonClick:

public void onClick(View view) { 
    int viewId = view.getId(); 

    if (viewId == EXPECTED_VIEW_ID) { 
     Intent intent = new Intent(this, CarouselActivity.class); 
     startActivity(intent); 
    } 
} 

Trong tôi Activity Tôi có một mục đó là thể nhấp cùng với cùng một tọa độ trên màn hình.

Điều gì xảy ra là nếu người dùng nhấp thực sự nhanh chóng trên Button thì sự kiện nhấp chuột này được chuyển sang mới bắt đầu Activity và xử lý onClick khác xảy ra.

Tôi đã thử 2.3.3 & 2.3.5 khung phiên bản & hành vi là như nhau. Bất kỳ ý tưởng?

Trả lời

1

Một giải pháp đơn giản sẽ thêm một giá trị boolean xác định có hay không một nhấp chuột được xử lý sau đó tạo ra một chủ đề mà ngủ sau đó đặt giá trị là true

public void onClick(View view) { 

    if (inputAllowed) { 
     //do stuff 
    } 
} 

boolean inputAllowed = true; 
private class ButtonDelay extends AsyncTask<Void, Void, Void> { 
    @Override 
    protected void onPreExecute() { 

    } 

    @Override 
    protected Void doInBackground(Void... params) { 

     try { 
      inputAllowed = false; 

      Thread.sleep(500); 
      inputAllowed = true; 
     } catch (InterruptedException e) { 

      e.printStackTrace(); 
     } 
     return null; 

    } 

    @Override 
    protected void onPostExecute(final Void unused) { 

    } 

} 

Và bắt đầu AsyncTask ngay trong onCreate() . Đối với lý do tại sao điều này xảy ra tôi đoán hoạt động mới đã tạo ra nút mới và vì người dùng nhấp nhanh vào đó, hãy đăng ký các nhấp chuột này.

+0

Đường nối này giống như một công việc xung quanh, nhưng theo cách này tôi phải làm điều đó trong mọi Hoạt động tôi bắt đầu và cho mỗi chế độ xem tôi tạo. Điều này có vẻ xấu ;-) Có thể có một cách để "thiết lập lại" hàng đợi vào hoạt động bắt đầu? –

+1

Tôi không nghĩ rằng có một cách để thiết lập lại và không có điểm nếu đặt lại xảy ra trước khi nhấp chuột cuối cùng (tức là người dùng vẫn đang nhấp chuột như một moron), tôi sử dụng mã này nhưng tôi có nó lớp ứng dụng toàn cầu và số nguyên cho biết kiểu đầu vào là gì, cùng asynctask nhưng nó lấy trong số nguyên đại diện cho đầu vào, ví dụ như được ép lại và khóa loại đầu vào đó. Bạn có thể bảo vệ người dùng khỏi các nhấp chuột không cố ý như thế này, nếu họ đang nhấp chuột ngu ngốc thì bạn không thể làm gì để bảo vệ ứng dụng của mình khỏi hành động đạo đức của họ. – triggs

+0

Sau đó khóa toàn bộ chế độ xem lưới. – triggs

1

Sự cố của bạn không phải là sự kiện nhấp được chuyển sang hoạt động mới. Vấn đề là sau khi nhấp chuột đầu tiên mà bạn đang thực hiện hoạt động mới của bạn sẽ bắt đầu xuất hiện. Nếu người dùng nhấp một lần nữa vào một số lần hoạt động mới của bạn tải và nhận được nhấp chuột như nó được cho là phải làm. Tôi sẽ giả định rằng bạn đang chặn UI-Thread trong quá trình thay đổi hoạt động của bạn và do đó người dùng không chắc chắn liệu anh ta đã nhấn nút và cố gắng nhấp vào nó một lần nữa hay không.

Cố gắng tăng tốc hoạt động của bạn. Bạn chỉ có thể hiển thị Lớp phủ với Spinner bắt tất cả các sự kiện nhấp cho đến khi bạn sẵn sàng hiển thị giao diện người dùng chính xác của Hoạt động. Bằng cách đó, người dùng nhận ra rằng có điều gì đó đã xảy ra và sẽ ngừng nhấp và đợi cho spinner biến mất.

+0

Bạn hiện đang ở mức 100%. Giả định của bạn là sai và tất cả những gì tôi làm là xử lý onClick và thực hiện startActivity. Không có cách nào nó cal khối UI-Thread :-) Vấn đề của tôi là loại "thử nghiệm khỉ" hoặc "nhấp chuột như một moron" đã đề cập trước đây. Người dùng nhấp chuột chỉ vài lần trên hoạt động không tìm kiếm nếu nút đã thực sự được nhấp hoặc bỏ qua. Tuy nhiên lớp phủ với ý tưởng spinner trông thú vị với tôi. –

+0

Chặn cũng có thể xuất hiện trong chế độ xem của hoạt động tiếp theo.Nếu bạn đang tải một chút bố cục phức tạp trong onCreate hoặc truy cập một tệp tùy chọn được chia sẻ lần đầu tiên, phương thức onCreate có thể mất chút thời gian để tăng lượt xem. – Janusz

+0

Trong trường hợp tạo bi quan nhất mất khoảng 100ms. Tuy nhiên tôi có lẽ sẽ quyết định không phản đối người dùng từ chính mình với vấn đề đó. –

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