2012-09-25 5 views
3

나는 가능한지 아닌지에 대해 큰 의문을 가지고있는 새로운 앱을 개발 중입니다. 의심의 여지가전체 안드로이드 애플리케이션을위한 터치 이벤트

전체 애플리케이션에 대해 한 번만 청취자를 설정해야합니다. 우리는 애플리케이션에서 발생하는 모든 터치 이벤트에 대해 일련의 코드를 실행해야합니다. 예를 들어. 앱에 n 개의 활동이있을 수 있습니다. 그러나 우리는 모든 활동에 대해 하나의 시간 청취자를 설정하고 n 개의 활동 중 하나에서 터치가 발생할 때 세트 코드를 실행해야합니다. 나는 그것을 위해 많은 노력을했습니다. 어떤 아이디어라도 환영합니다. 미리 감사드립니다.

+0

을 통과하는 모든 터치 이벤트보다

public class MainActivity extends MyCustomActivity{ } 

: ND 다른 모든 MyCustomActivity에서 활동을 확장? 어디로받을까요? – dor506

+0

내 질문이 변경되었습니다. 지금 이해할 수 있습니까? – Sri

답변

0

수행 할 수있는 작업은 응용 프로그램의 다른 모든 활동으로 확장되는 기본 활동 클래스를 만드는 것입니다. 그런 다음이 기본 활동에서 public boolean dispatchTouchEvent (MotionEvent ev) 메소드를 대체 할 수 있습니다. 이 재정의 된 구현은 모든 터치 이벤트가 발생하는 단일 장소가됩니다.

2

당신이 할 수있는 -

모든 활동 (그들 모두 Activitiy 종류 또는 그 모든 유형 ListActivity의 수 있습니다 예를 들어)이 같은 유형은 경우에만 작동합니다, 한 가지 중요한주의 생각이있다 보이지 않는 사용자 정의보기를 만들고, 모든 화면을 사용하며, onTouchEvent를 사용하여 수행해야하는 작업을 수행합니다.

그런 다음 상단 (아마도 FrameLayout)에 해당보기를 포함 할 모든 레이아웃 파일이 있어야합니다.

0

총 가능합니다.

MyTouchActivity (또는 무언가) 액티비티를 만들면 onTouch 이벤트를 덮어 쓰고 여기에서 set 코드를 작성하십시오.

이제 나머지 활동은 n 정규 활동 대신 MyTouchActivity으로 확장되어야합니다. 이 코드는 모든 n 개의 활동에 상속됩니다. 당신은

다른 방법은 단순히 Ontouch 리스너를 만든 다음 먼저 리스너를 호출하는 각 활동의 각 onTocuh 이벤트를 무시하는 것 (MapActivity에 대한) (ListActivity에 대한) 별도의 MyTouchListActivity 및 MyTouchMapActivity 만들어야합니다. 그러나 그것은 성 가시다.

+0

그것의 작동하지만, 만약 내가 어떤 활동에 버튼을 추가하고 단추를 클릭하면 의미, ontouch 이벤트가 작동하지 않습니다! – Sri

+0

@Srinivas, 죄송합니다. 좀 더 구체적으로 말씀해 주시겠습니까? 버튼이 클릭에 응답하지 않습니까? onClickListener에 등록 했습니까? 'onTouch'에서 허위로 돌아 왔습니까? true를 반환하면 touch 이벤트가 구성 요소로 전달되지 않습니다 (예 : 버튼 등). false 또는'super.onTouch()'가 반환되는지 확인하십시오. – st0le

+0

ontouchevent()에서 로그인 할 때 빈 화면에 닿으면 해당 로그를 인쇄하지만 같은 화면에서 버튼을 클릭하면 인쇄되지 않습니다. – Sri

3

나는 당신을 올바르게 이해하기를 바랍니다.

당신이 할 수있는 일은 활동을 확장하는 클래스를 만드는 것입니다. TouchActivity를 말하십시오. 각 액티비티는 TouchActivity를 상속받습니다.

public class TouchActivity extends Activity 
{ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) 
    { 
     if (event.getAction() == MotionEvent.ACTION_DOWN) 
     { 
      Log.d("Touch", "Touch"); 
      sendBroadcast(new Intent("touch_event_has_occured")); 
     } 

     return super.onTouchEvent(event); 
    } 
} 

이제 글로벌 방송 수신기에서 당신은 얻을 것이다의 브로드 캐스트

public class TouchReveiver extends BroadcastReceiver 
{ 

    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     if (intent.getAction().equals("touch_event_has_occured")) 
     { 
      Log.d("Touch", "Touch"); 
     } 
    } 

} 

당신이 전체 앱이 사용하는 whant 경우 작업

+1

창과 대화 상자에서 작동합니까 ?? – user3207655

0

와 수신기를 등록하는 것을 잊지 마십시오 ActionBarActivity (또는 SherlockActivity)에서 확장되는 클래스를 생성해야합니다.

public class MyCustomActivity extends ActionBarActivity{ 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     FrameLayout decorView = (FrameLayout) getActivity().getWindow().getDecorView(); 
     decorView.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       Log.d(TAG, "Click X:" + event.getX() + " Y:" + event.getY()); 
       return false; 
      } 
     }); 
    } 
} 

당신은 "방송을 수신"은 무엇을 의미합니까 당신의 TouchListener 이벤트