2011-10-20 199 views
3

我想覆蓋從Activity派生的類(稱爲NativeActivity),所以我可以在Java中創建自己的內容視圖,而將其餘的功能留在圓括號中。我必須使用NativeActivity,因爲它是在Xperia Play上獲取觸控板輸入的唯一方法。我需要重寫的方法是NativeActivity.onCreate()方法,因爲這是我不想要的內容視圖被設置的位置。問題是,如果我沒有在重寫的onCreate()方法中調用super.onCreate(),則會引發SuperNotCalledException。這來自Activity類。但是,所有的Activity.onCreate()方法並設置一個布爾值:Android:有沒有解決SuperNotCalledException的方法?

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

我能做到這一點檢查在我自己的代碼,使用Activity.getWindow()方法。不幸的是,mCalled布爾值是私有的,所以我不能在我自己的代碼中將其設置爲true。我似乎無法弄清楚如何繞過這個要求。有任何想法嗎?

回答

0

我從研究Activity的源代碼中發現的一件事是,你可以調用其中一個在基類Activity語句中將mCalled設置爲true的方法,這些方法在子類中沒有被覆蓋,並且在基類中什麼都不做活動類。所以在NativeActivty的情況下,一個可以稱之爲像super.onRestart();,因爲這個類沒有被覆蓋NativeActivity的,正如你可以看到下面,它並沒有在活動類做任何事情:

protected void onRestart() { 
    mCalled = true; 
} 

這是相當黑客,並且可能會在將來的版本中被打破,但如果您不想僅因爲一個簡單的布爾值就不得不重新創建Activity的整個子類,那麼它可以是一個快速解決方案。

0

當您在活動上覆蓋此方法時,您必須致電super.onCreate(savedInstance)

通過代碼挖掘此檢查看起來像它旨在確保任何自定義檢測工作正常。在我們所有的定製活動中,對某些方法調用super的要求是實施的一個意想不到的結果。

沒有進入的細節爲什麼這是一個糟糕的OOP的設計,我可以說,至少它是足夠簡單,只需撥打super.onCreate(savedInstanceState)在onCreate()方法。從代碼中可以看到,沒有不良副作用。

+0

不良副作用來自NativeActivity.onCreate()方法。在Java中沒有super.super。重寫該方法的重點是我不想調用它。 – paulscode

+0

@ user1002212我不知道我是否理解你。這只是個人的願望,不要調用super.onCreate()? – spatulamania

+0

這沒什麼個人的,這是一個要求。正如我上面的問題所述,我的類擴展了NativeActivity,而不是Activity。我想避免調用NativeActivity.onCreate(如果我調用super.onCreate,會發生這種情況),因爲在NativyActivity.onCreate中它設置了內容視圖(我不想這麼做)。 – paulscode

相關問題