2017-03-21 17 views
1

버튼과 그 두 명의 청취자을 처리하는 데 문제가 있습니다. 내 목표는 그것을 사용하는 버튼의 두 청취자를 교환입니다. 내가 필요한 행동이 아닙니다. 단추를 놓은 다음 다시 다른 방식으로 (다른 청취자와 함께) 단추를 눌러야합니다. 그래서 ..이 버튼을 "터치"하고 손가락을 떼면 "onTouch"리스너를 "onClick()"으로 바꿔야합니다.Android에서 리스너 간 전환

지금, 나는 다음을 수행 내 목표를 달성하기 위해 노력 :

final View.OnClickListener play_listener = new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { Utility.playRecording(mediaPlayer); } }; 

final View.OnTouchListener rec_listener = new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View view, MotionEvent event) { 
      if (Utility.checkPermission(view.getContext())) { 
       switch (event.getAction()) { 
        case MotionEvent.ACTION_DOWN: 
         Utility.startRecording(recorder, output_formats, currentFormat, file_exts, timer); 
         break; 

        case MotionEvent.ACTION_UP: 
         Utility.stopRecording(recorder, timer); 
        //disabling my onTouch Listener 
         recplay_button.setOnTouchListener(null); 
        //Setting a new listener for the same button 
         recplay_button.setOnClickListener(play_listener); 
        //Changing its color. 
         recplay_button.setBackground(getDrawable(R.drawable.coloranimreverse)); 
         break; 
       } 
      } else { 
       Utility.requestPermission(view.getContext()); 
      } return false; }}; 

그래서, 교환 작동하지만 나는 이유를 얻을 수없는 이유를 소리 나는 연주는이 OnClickListener를이 또한 그것을 실행 설정 한 후 다른 청취자에게 설정됩니다. MotionEvent.ACTION_UP이 클릭으로 계산됩니까?

어떻게 해결할 수 있는지 알고 계십니까? 필요한 것은 OnTouch() 수신기에서 설정 한 것과 동일한 순간에 onClick() 수신기를 실행하지 않는 것입니다.

감사합니다.

+0

내가 제대로 따라 해요 있는지 확실하지 않습니다, 또는 당신은 다음과 같이 그 일을하는 이유를 정확하게,하지만하지 않으려면'OnClickListener'는 후 발사 'ACTION_UP' 이벤트,'true'를 반환합니다. –

+0

나는 그것을 내일 시도 할 것이다. 내가하려고하는 일은 버튼을 클릭하는 다른 모드를 연결하여 다른 작업을 시작하는 것입니다. – Cesarsk

+0

횃불을 클릭하십시오 -> 내 미디어를 기록하십시오. 그 후, onclick -> 내 미디어를 재생 – Cesarsk

답변

1

귀하의 OnClickListener은 무조건 에서 false을 돌려주기 때문에 ACTION_UP에 발사됩니다. false을 반환하면 View에게 이벤트를 사용하지 않았으며 이벤트도 처리해야 함을 알립니다. 이 경우 View이 클릭 처리를 수행하고 이제는 OnClickListener 세트가 호출됨을 의미합니다. (사실, 당신은 처음부터 OnClickListener 설정 한 수와 동일한 동작을 달성 한 것입니다.)

은 당신이 거기에 해당 이벤트를 소비하고 있다는 신호 것이다 ACTION_UPcasetrue 반환, 그래서 View원 결국 전화 번호는 OnClickListener입니다. 이는 유스 케이스의 경우에는 충분하지만 View은 일반적으로 ACTION_UP에 대해 수행 할 다른 상태 변경을 수행하지 않습니다. 예를 들어 Drawable으로 변경하면 상태가되지 않습니다.

리스너를 저글링하는 대신 소비 할 이벤트와 전달할 항목을 결정하려고 시도하면 OnTouchListener의 모든 내용을 처리하고 플래그 변수의 현재 상태를 추적하고 다시 false을 반환하는 것이 바람직 할 수 있습니다. 무조건 onTouch()에. 이런 식으로 원하는 동작을 단순히 "삽입"하고 View이 정상적으로 이벤트 및 상태를 처리하도록 허용합니다.

예를 들어

:

private boolean recordState = true; 

final View.OnTouchListener rec_listener = new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View view, MotionEvent event) { 
     if (Utility.checkPermission(view.getContext())) { 
      switch (event.getAction()) { 
       case MotionEvent.ACTION_DOWN: 
        if (recordState) { 
         Utility.startRecording(recorder, output_formats, currentFormat, file_exts, timer); 
        } 
        break; 

       case MotionEvent.ACTION_UP: 
        if (recordState) { 
         recordState = false; 
         Utility.stopRecording(recorder, timer); 
         recplay_button.setImageDrawable(getResources().getDrawable(R.drawable.coloranimreverse)); 
        } 
        else { 
         Utility.playRecording(mediaPlayer); 
        } 
      } 
     } else { 
      Utility.requestPermission(view.getContext()); 
     } 
     return false; 
    } 
}; 
+0

의견을 보내 주셔서 감사합니다. 플래그를 사용하여 코드를 업데이트하려고 노력할 것이고 결국에는 여기에서 내 질문을 업데이트 할 것입니다. – Cesarsk

+0

문제 없습니다. 다행히 도울 수있어. 건배! –