2011-02-23 2 views
0

안녕하세요 하나의 이미지가있는 ImageButton이 하나 있습니다. onclick 이벤트를 추가하고 일반적으로 잘 작동합니다. Imagebutton을 클릭하면 항목 추가 기능이 작동합니다.Android GUI :: 연속 클릭 이벤트가 중단됩니다.

사용자가 내 이미지 단추를 계속 클릭하면 내 추가 항목 기능이 동일한 데이터로 여러 번 실행됩니다. 나는 그것을 막고 싶다. 즉, Imagebutton은 내 함수가 완전히 실행될 때까지 다음 클릭 이벤트를 처리하기 위해 큐에 대기해서는 안됩니다.

OnClick 이벤트가 실행되는 즉시 myImageButton.setEnable(false)을 시도했습니다. 그리고 나서 내 데이터 입력 기능을 수행 한 후

myImageButton.setEnable(true)을 입력하십시오.

또한이 코드를 myImageButton.isEnabled()에 넣으려고했으나 작동하지 않았습니다.

대기중인 클릭 이벤트를 무시하는 방법은 무엇입니까? 클릭 처리를 무시하거나 무시하는 다른 방법이 있습니까 (setEnable())?

println 문을 사용하여 각 클릭 이벤트가 동기화되었음을 확인했습니다 ... 모든 코드가 순서대로 실행됨을 의미합니다.

편집

private OnClickListener m_AddClickHandler = new OnClickListener() 
    { 
     public void onClick(View v) 
     { 
      if(m_bDoAdd) 
      { 
       m_bDoAdd = false; 
       new AddTask().execute(); 
      } 
      else 
       logData("Add::OnClick::not clicked"); 
     } 
    }; 
private class AddTask extends AsyncTask<Void, Void, Integer> 
    { 
     @Override 
     protected Integer doInBackground(Void... params) 
     { 
      logData("doinbg, start"+m_bDoAdd); 
      int iStatus =Add(m_data); 
      logData("doinbg, start end, status="+iStatus+"flag="+m_bDoAdd); 
      return iStatus; 
     } 

     @Override 
     protected void onPostExecute(Integer result) 
     { 
      logData("onpostExec, start"+m_bDoAdd); 
      int iStatus = result; 
      if (iStatus == 0) 
      { 
       Toast.makeText(getApplicationContext(), R.string.strAdded, Toast.LENGTH_SHORT).show(); 
      } 
      else if (iStatus == 1) 
      { 
       Toast.makeText(getApplicationContext(), R.string.strAlreadyExists, Toast.LENGTH_SHORT).show(); 
      } 
      else 
      { 
       Toast.makeText(getApplicationContext(), R.string.strAddFailed, Toast.LENGTH_SHORT).show(); 
      } 

      m_bDoAdd = true; 
      logData("onpostExec, end"+m_bDoAdd); 
     } 
    } 

    void Add() 
    { 
     // Add info to db (takes few msecs) 
    } 

난 아직도 받고 있지 않다 "추가 ::의 OnClick : 클릭하지"로그에.

추가 실마리?

+0

setClickable (부울 값)을 사용해야합니다. 항상 저에게 효과적입니다. – Klaus

답변

1

의 onclick 핸들러 내에서이 시도 :

myImageButton.setClickable(false); 

업데이트 :

how events work in Android입니다 :

사용자가 이벤트가 이벤트 큐에 추가됩니다보기를 클릭
  1. .
  2. 이벤트는 순차적으로 EDT에서 처리됩니다.
  3. 이벤트 대기열 및 이벤트 발송은 별도의 스레드에서 수행됩니다. 이벤트 처리는 새 이벤트의 대기열에 포함되지 않습니다.

문제에 대한 해결책 :

  1. 당신은 EDT를 차단 가능한 한 빨리 이벤트를 처리해서는 안된다. 즉, 백그라운드 스레드에서 오랫동안 실행중인 모든 작업 (= 데이터베이스 작업)을 수행해야하며, AsyncTask를 사용하십시오.
  2. 백그라운드 작업을 시작할 때 플래그 (backgroundWorkRunning)를 설정하고 완료되면 지워야합니다.
  3. 새 이벤트가 전달되면 먼저 backgroundWorkRunning 플래그를 확인하십시오. 플래그가 이미 설정된 경우 아무 작업도 수행하지 않습니다.
+0

조금 도움이되었습니다. 15 번의 연속 클릭 중 2 회만 피할 수있었습니다. – JRC

+0

가능한 해결책으로 게시물을 업데이트했습니다. –

1

기본적으로 거짓으로 설정되는 부울 variale와 같은 전역 플래그를 사용할 수 있으며 false 일 때 addd entry 함수가 실행됩니다. 함수를 입력 할 때 플래그를 true로 설정하십시오. 희망이 도움이됩니다.

+0

시도해 보니 행운이 없습니다 – JRC

+0

코드를 게시 할 수 있습니까? –

+0

add m_ivAdd.setClickable (true); 내부 기능 추가, 끝에 ... –

0

클릭 이벤트 처리에서 true로 설정할 수있는 정적 부울 변수를 사용할 수 있습니다. 해당 버튼을 클릭하면 true로 표시되고 변수가 true인지 여부를 확인하는 if 블록도 적용됩니다. 당신의 작업이 완료되고 코드 흐름이 onClickListener가 존재하려고 할 때, 당신은 다시 부울 변수를 false로 설정할 수 있습니다.

+0

시도해도 행운이 없다 – JRC

관련 문제