2012-03-07 2 views
0

이 애플리케이션에는 layout이 있습니다. 이제 사용자가 일부 버튼을 터치하고 그 버튼에서 손가락을 떼면 키가 텍스트 상자에 입력됩니다. 사용자에게 해당 편지를 발음하는 동안 의미합니다. "B가 입력되었습니다"라고 말합니다. 그래서 ACTION_UP 동안입니다. 이 이벤트를 처리하는 동안 나는 우연히 사용자가 터치하더라도 터치 이벤트를 방지해야합니다.하나의 컨텍스트에서 작동하지만 다른 컨텍스트에서는 작동하지 않는 터치 리스너 비활성화

터치 이벤트 중에 (UP 상태에서) 터치 리스너를 사용하지 않도록 설정하고 있지만 일어나지 않습니다. 터치 이벤트가 대기 중이고 현재 터치 이벤트가 처리되는 동안 터치 이벤트를 사용 중지하는 방법이 표시되지 않습니다. 하드 키 이벤트 처리 중에이 작업을 수행 할 수있었습니다. 나는이 이상한 행동을 이해할 수 없었다. 여기

내 코드

공공 부울 onTouch (보기 V, MotionEvent 이벤트)입니다 {

// TODO 자동 생성 방법 스텁 문자열의 = NULL;

s = ((Button) v).getText().toString().trim(); 

    switch (event.getAction() & MotionEvent.ACTION_MASK) { 


    case MotionEvent.ACTION_DOWN: 

     b_prev=(Button)v; 
     //while(tts.isSpeaking()); 
     tts.speak(s, TextToSpeech.QUEUE_FLUSH, null); 

     break; 
    case MotionEvent.ACTION_UP: 

     fun(false); //disabling the touch event for all buttons 


     for(int i=0;i<mybtn.length;i++) 
     { 
      if(isPointInsideView(event.getRawX(),event.getRawY(),mybtn[i])) 
      { 
       s = (mybtn[i]).getText().toString().trim(); 
       btn=mybtn[i]; 
       break; 
       //et.setText("up android" + s, TextView.BufferType.EDITABLE); 
      } 
     } 

     if(btn.equals(mybtn[27])) //clear button pressed 
     { 
      //do something 
     } 

     else if(btn.equals(mybtn[26])) //space button 
     { 
      //do soemthing 

     } 

     else 
     { 
      //do soemthing 
     } 


     fun(true); //enabling touch event for all buttons 


     break; 
    case MotionEvent.ACTION_MOVE: 

     for(int i=0;i<mybtn.length;i++) 
     { 
      if(isPointInsideView(event.getRawX(),event.getRawY(),mybtn[i])) 
      { 
       s = (mybtn[i]).getText().toString().trim(); 
       btn=mybtn[i]; 
       break; 
       //et.setText("down android" + s, TextView.BufferType.EDITABLE); 

      } 
     } 


     break; 


    } 


    return true; 
} 

void fun(boolean flag) 
{ 
    int i; 

    for(i=0;i<mybtn.length;i++) 
    { 
     if(flag==true) 
     mybtn[i].setOnTouchListener(this); 
     else 
      mybtn[i].setOnTouchListener(null); 
     mybtn[i].setEnabled(flag); 
    } 

} 

재미있는 터치 이벤트를 사용하지 않더라도 현재 터치 이벤트가 완료된 후 큐에 대기 중이고 실행 중입니다. 그래서이 문제를 해결하기 위해 내가해야 할 일을 말해주십시오.

나는 확인 이벤트에서 두 개의 하드 키를 사용하고 있다는 관찰을했습니다. 하드 키 이벤트를 사용하면 레이아웃 단추를 비활성화/활성화해도 문제가 없습니다. 그러나 위의 시나리오에서는 작동하지 않습니다. 그게 무슨 문제일까요? 나는 그 코드도 첨부하고있다. 이것 봐. 왜 이런 일이 일어나는지 모르겠다.

공공 부울 onKeyUp에 (INT 키 코드, KeyEvent를 이벤트) {

if (keyCode == KeyEvent.KEYCODE_SEARCH 
      && event.getRepeatCount() == 0) 
    { 
     String s = et.getText().toString().trim(); 

     fun(false); //disable touch events 

     if(pass==1 && quit==1) 
     { 
      name= et.getText().toString().trim(); 
      number=get_Number(name); 

      if(number!=null) 
      { 
       pass++; // go for confirmation 
       in = new Intent(ContactActivity.this, Calling.class); 
       tts.speak("contact found", TextToSpeech.QUEUE_FLUSH, null); 
       while(tts.isSpeaking()); 
       tts.speak("Do u want to continue", TextToSpeech.QUEUE_FLUSH, null); 
       while(tts.isSpeaking()); 

      } 

      else 
      { 
       tts.speak(name +"does not exist", TextToSpeech.QUEUE_FLUSH, null); 
       while(tts.isSpeaking()); 
       tts.speak("try again", TextToSpeech.QUEUE_FLUSH, null); 
       while(tts.isSpeaking()); 

       fun(true); //enable touch events 

      } 


     } 

     else if(pass==2) 
     { 

      b.putString("number", number); 
      in.putExtras(b); 
      tts.speak("calling"+name, TextToSpeech.QUEUE_FLUSH, null); 
      while(tts.isSpeaking()); 
      tts.shutdown(); 
      startActivity(in); 
      //int pid = android.os.Process.myPid(); 
      //android.os.Process.killProcess(pid); 
      finish(); 

      //Intent 

     } 

     else if (quit==2) { 

      while(tts.isSpeaking()); 
      tts.speak("Quitting application",TextToSpeech.QUEUE_FLUSH, null); 

      while(tts.isSpeaking()); 
      tts.shutdown(); 
      finish(); 

      } 


    }//end of if 


    else if (keyCode == KeyEvent.KEYCODE_MENU 
      && event.getRepeatCount() == 0) 
    { 

     fun(false);//disable touch events 

     if(pass==2) 
     { 

      pass=1; 
      //while(tts.isSpeaking()); 
      tts.speak("Going back",TextToSpeech.QUEUE_FLUSH, null); 
      while(tts.isSpeaking()); 
      fun(true); 
      //mhandler.postDelayed(mUpdateTimeTask, 1000); 

     } 

     else if(quit==2) 
     { 
      quit=1; 
      //while(tts.isSpeaking()); 
      tts.speak("Going back",TextToSpeech.QUEUE_FLUSH, null); 
      while(tts.isSpeaking()); 

      fun(true);//enable touch events 

     } 

     else if(quit==1) 
     { 
      quit++; 
      //mhandler.removeCallbacks(mUpdateTimeTask); 
      //while(tts.isSpeaking()); 
      tts.speak("Do u want to quit",TextToSpeech.QUEUE_FLUSH, null); 
      while(tts.isSpeaking()); 
      //Toast.makeText(TimerActivity.this,"Do u want to quit",Toast.LENGTH_LONG).show(); 


     } 


    } 
    return true; 
} 
+0

누군가 날 좀 도와주세요, 내가 많이 봤 다른 방법으로 시도 여기에 언급 된 해결 방법을 시도 하지만 여전히이 문제를 해결하는 방법에 대한 명확한 아이디어를 얻지 못했습니다 .... – siva

+0

얘들 아,이 문제를 해결하기 위해 나를 도와주세요. 나는 그것을 많이 사용하지 않으려 고 노력했다. 나는 그것이 잘못되고있는 것을 얻지 못하고있다 .. – siva

답변

0

Android button enabling/disabling not working

onClick(View v) 
{ 
    if(condition) 
    { 
      return; 
    } 
    else 
    { 
     //perform onClick stuff 
    } 
} 
+0

아니야, 내 problem.i에 대한 모든 해결책이 아니다. 터치 이벤트를 다루고있다. , MOVE 및 UP. fun() 함수는 실제로 작업을 수행해야합니다. 하지만 그것을하고 있지 않다, 내가 무엇을 어떻게해야하고 그것을 밖으로 일하는 방법을 얻지 못하고있다 – siva

+0

BTW 그것은 그냥 입력을 처리 할 수 ​​있도록 버튼을 사용하지 않는 것이 좋습니다, 나는 어떤 요청을 비활성화하고 그들을 대기열에 제안하지 않을 것입니다 업 그레 이드 및 별도의 스레드에서 하나씩 처리 – Soham

+0

나는 u를 얻지 못했습니다. UP 이벤트가 완료되지 않을 때까지 터치 이벤트를 차단하고 싶습니다. 완료되면 터치 이벤트를 다시 활성화합니다. – siva

관련 문제