2011-10-20 3 views
3

저는 Activity에서 파생 된 클래스 (NativeActivity라고 함)를 재정의하려고하므로 Java에서 만든 자체 컨텐츠 뷰를 설정할 수 있으며 나머지 기능은 그대로 유지합니다. Xperia Play에서 터치 패드 입력을 얻는 유일한 방법이기 때문에 NativeActivity를 사용해야합니다. 재정의 할 필요가있는 메서드는 NativeActivity.onCreate() 메서드입니다.이 메서드는 원하지 않는 콘텐츠 뷰를 설정하기 때문에 사용됩니다. 문제는, 재정의 된 onCreate() 메서드에서 super.onCreate()를 호출하지 않으면 SuperNotCalledException이 throw됩니다. 이것은 Activity 클래스에서 가져옵니다.안드로이드 : SuperNotCalledException 주위에 방법이 있습니까?

 protected void onCreate(Bundle savedInstanceState) { 
      mVisibleFromClient = !mWindow 
        .getWindowStyle() 
        .getBoolean(
          com.android.internal.R.styleable.Window_windowNoDisplay, 
          false); 
      mCalled = true; 
     } 

나는 Activity.getWindow() 메소드를 사용하여 내 자신의 코드에 그 검사를 수행 할 수 있습니다하지만 모든은 Activity.onCreate() 메소드는 boolean를 설정 않습니다. 안타깝게도 mCalled 부울은 private이므로 내 코드에서 true로 설정할 수는 없습니다. 이 요구 사항을 해결하는 방법을 알아낼 수 없습니다. 어떤 아이디어?

답변

0

Activity의 소스 코드를 연구하면서 알아 낸 것 중 하나는베이스 액티비티 클래스에서 mCalled를 true로 설정하는 메소드 중 하나를 호출 할 수 있다는 것입니다.이 클래스는 서브 클래스에서 오버라이드되지 않으며 기본에서는 아무것도 수행하지 않습니다. 활동 클래스. NativeActivty의 경우 그래서이 클래스 NativeActivity에 의해 오버라이드 (override)되지 않기 때문에, 하나는, super.onRestart(); 같은 것을 호출 할 수 있으며, 아래 볼 수 있듯이, 그것은 활동 수업 시간에 아무것도하지 않습니다

protected void onRestart() { 
    mCalled = true; 
} 

이가 상당히 hackish하고, 미래의 버전에서 깨질 수 있지만, 단순한 부울 하나 때문에 Activity의 전체 하위 클래스를 다시 만들지 않으려면 빠른 해결책이 될 수 있습니다.

0

액티비티에서이 메서드를 재정의 할 때 super.onCreate(savedInstance)으로 호출해야합니다.

코드를 살펴보면 사용자 정의 계측이 올바르게 작동하는지 확인하기위한 것입니다. 모든 사용자 정의 액티비티에서 일부 메서드에 대해 super를 호출해야한다는 요구는 구현의 의도하지 않은 결과였습니다. 이 나쁜 OOP 디자인 이유의 세부 사항에 들어가기없이

, 나는 적어도 그냥에서 onCreate() 메소드에 super.onCreate(savedInstanceState)를 호출 할 수있을만큼 간단 말할 수 있습니다. 코드에서 알 수 있듯이 나쁜 부작용은 없습니다.

+0

나쁜 부작용은 NativeActivity.onCreate() 메소드에서 비롯됩니다. Java에는 super.super가 없습니다. 메서드를 재정의하는 것은 내가 그것을 호출하고 싶지 않다는 것이다. – paulscode

+0

@ user1002212 내가 당신을 이해하는지 잘 모르겠습니다. 슈퍼를 부르지 않는 것이 개인적인 욕구일까요? 창조()? – spatulamania

+0

그것은 개인적인 것이 아니며 요구 사항입니다. 위의 질문에서 설명한 것처럼 클래스는 Activity가 아닌 NativeActivity를 확장합니다. 나는 NativeActivity.onCreate를 호출하는 것을 피하고자한다. 왜냐하면 NativyActivity.onCreate에서 내용보기를 설정하기 때문에 (나는 super.onCreate를 호출하면 일어날 것이다) (나는 그것을하고 싶지 않다). – paulscode

관련 문제