2010-05-22 3 views
10

나는 OnClickListener가있는 버튼을 가지고 있습니다. 설명을 위해 모달 대화 상자를 표시하는 버튼을 고려하십시오.버튼을 빠르게 누르기 다루기

public class SomeActivity ... { 

    protected void onCreate(Bundle state) { 
    super.onCreate(state); 

    findViewById(R.id.ok_button).setOnClickListener(
     new View.OnClickListener() { 
     public void onClick(View v) { 
      // This should block input 
      new AlertDialog.Builder(SomeActivity.this) 
      .setCancelable(true) 
      .show(); 
     } 
    }); 
} 

정상적인 사용 환경에서는 경고 대화 상자가 나타나고 추가 입력을 차단합니다. 사용자는 버튼을 다시 탭하기 전에 대화 상자를 닫아야합니다.

하지만 대화 상자가 나타나기 전에 버튼의 OnClickListener가 두 번 호출되는 경우가 있습니다. 버튼을 빠르게 탭하여 이것을 쉽게 복제 할 수 있습니다. 일반적으로 여러 번 시도해야하지만 조만간 대화 상자에서 입력을 차단하기 전에 onClick (...) 호출을 여러 번 트리거합니다.

Motorola Droid 휴대 전화의 Android 2.1에서이 동작을 볼 수 있습니다. 마켓에서 4 가지 오류보고가 접수되었습니다. 이는 가끔씩 사람들에게 발생하는 것입니다.

OnClickListeners의 기능에 따라 모든 종류의 혼란이 발생합니다. 차단 대화 상자가 첫 번째 탭 이후 실제로 입력을 차단하도록 어떻게 보장 할 수 있습니까?

+0

onClick() 외부에서 AlertDialog를 생성하고 onClick() 내에서 show()를 호출 해 보았습니까? – jfpoilpret

답변

17

Romain Guy는 Android에서 실제로 버그라고 확인했습니다. "사용자가 < 125ms에 버튼을 두 번 누르면 관리가 가능합니다 .Froyo에서 가능한 오류가 수정 된 것 같습니다."

"유리 창"패턴을 사용하여 이전 OS의 버그를 해결합니다. 즉, 보이지 않는 화면으로 화면을 덮을 것입니다. 첫 번째 클릭 이벤트가 발생하면 이후의 터치 이벤트를 가로 채기 위해 뷰를 '표시'하게 만듭니다.

버튼 하나로 더 이상 이벤트를 방지하는 것으로는 충분하지 않습니다. 대화 상자가 닫히거나 활동이 재개 될 때까지 전체 활동에 대한 모든 후속 이벤트를 차단해야합니다.이 시점에서 유리 창을 다시 "보이지 않게"만듭니다.

그래도 작동하지 않는다면, 우리는 이것으로 살아야하고 예상치 못한 추가 이벤트를 더 잘 견뎌야합니다.

+0

와우 ... 너 밥 리? –

+0

나는 "Bob"이 누구인지에 달려 있다고 생각합니다. :-) 나는 다른 어떤 Bob Lee 프로그래머도 몰라. :-) –

+1

밥 (Bob)과 저는 밥 (Bob)이 위에 설명한 것과 매우 유사한 것을 사용할 것입니다. 가장 큰 차이점은 우리의 "유리창"이 실제보기가 아니라는 것입니다. 대신 모든 활동은 공통 기본 활동을 확장하고 모든 대화 상자는 기본 대화 상자를 확장합니다. 이 기본 클래스가 있으므로 각각에 부울 플래그를 도입 할 수 있습니다. 이 플래그는 입력을 수락하거나 차단하는지 여부를 나타냅니다. 각 기본 클래스에서 dispatchTouchEvent를 대체합니다. 플래그를 기반으로 true를 반환하여 이벤트를 가로 채고 차단할 수 있습니다. 이 방법이 효과가있는 것 같습니다. –

9

mdma를 사용해 주셔서 감사합니다.하지만이 문제는 플랫폼 문제이며 코드 문제는 아닙니다. 더 나쁜 것은 사용자 코드에서 해결할 수있는 문제가 아니라는 것입니다 (터치 스크린 드라이버에서 전달되지 않은 세부 정보가 필요함). 또한 코드 예제는 생각했던대로 작동하지 않습니다. show()는 대화 상자를 즉시 ​​표시하지 않습니다. 결국 대화 상자를 표시하는 이벤트 큐의 끝에 메시지를 추가합니다. onClick()이 반환 된 후 더 많은 터치 이벤트가 이미 대기열에있을 수 있습니다.

사람들이 그 답변에 투표하는 이유를 모르겠습니다.

+0

안녕하세요, 답변을 삭제했습니다. 그러나 클릭 사이를 처리하고 대화 상자를 표시하는 사이에 상태를 파악하는 것이 불가능하다는 것을 알지 못하고 추가 클릭을 무시합니다. – mdma