2012-02-23 8 views
0

모든 활동에 대해 하나의 처리기를 작성하고 싶습니다. 하지만 한 가지 문제가 : 나는에서 활동하고 서로 확장 일부 활동을 heve 때모든 활동에 대한 Android onOptionsItemSelected (...) 수신기

class MyActivity extends Activity { 

    // ... 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // ... 
    } 
} 

하지만 반드시 무엇을 :이 작업을 위해 내가 활동 클래스를 상속이 같은이 핸들러를 오버라이드 (override) 할 필요가 있음을 알고 MapActivity?

+0

왜 그냥 별도의 클래스를 만들고 모든 활동 중에서 사용하지 않는 것이 좋을까요? – DeeV

답변

1

Java에서 다중 상속이 불가능하며 MapActivityActivity은 제어하는 ​​클래스를 확장 할 수 없으므로 불가능합니다.

각 기본 활동에는 onOptionsItemSelected(MenuItem item) 메쏘드가 있어야하지만 공유되는 다른 클래스를 호출하면 동일한 코드를 공유 할 수 있습니다.

class BaseActivity extends Activity { 
    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     MenuHelper.handleOnItemSelected(item); 
    } 
} 

.

class BaseMapActivity extends MapActivity { 
    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     MenuHelper.handleOnItemSelected(item); 
    } 
} 

.

class MenuHelper { 

    public static void handleOnItemSelected(MenuItem item) { 
      // do something.. 
    } 

} 
+0

예, 저는 이것을 알고 있습니다. 그러나 제 처리기에서 내 활동 중 하나의 사적인 변수를 사용 한다면요. 예를 들어. someMethod (this)와 같은 컨텍스트를 보낼 때 (선언 : public void someMethod (Context context))? –

+0

예, 필요한 경우 해당 액티비티를 처리기 메서드에 전달할 수 있습니다. 그렇지 않으면 필요한 필드를 메서드에 직접 전달하십시오. –

+1

그렇게하지 마십시오. 공유 환경 설정 또는 하위 클래스 애플리케이션에 변수를 저장하십시오. – Sparky

0

당신은 MapActivity을 확장하여 MyMapActivity 클래스를 만들고, 이것과 다른 MyActivity에 대한 onOptionsItemSelected 구현, 같은 프로 시저를 호출 할 수 있습니다.

또는 MenuItem.setOnMenuItemClickListener으로 모든 메뉴 항목에 대해 사용자 지정 수신기를 설정하고이 수신기가 이벤트를 프로 시저에 전달하도록 할 수 있습니다.

관련 문제