2011-10-20 27 views
3

アクティビティから派生したクラス(NativeActivity)をオーバーライドしようとしています。そのため、Javaで作成した独自のコンテンツビューを設定し、その残りの機能をそのまま残しておきます。 Xperia Playでタッチパッド入力を取得する唯一の方法であるため、NativeActivityを使用する必要があります。私がオーバーライドする必要があるメソッドは、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

アクティビティのソースコードを調べたことの1つは、ベースアクティビティクラスでmCalledをtrueに設定したメソッドのうち、サブクラスでオーバーライドされていないもの、アクティビティクラス。したがって、このクラスはNativeActivityによって上書きされていないため、NativeActivtyの場合には、一つは、super.onRestart();ようなものを呼び出すことができ、あなたは以下を参照することができますよう、それはActivityクラスで何もしません。

protected void onRestart() { 
    mCalled = true; 
} 

これは、非常にハックがあり、将来のバージョンでは壊れる可能性がありますが、単純なブール値のためにアクティビティのサブクラス全体を再作成する必要がない場合は、すばやく解決することができます。

0

アクティビティでこのメソッドをオーバーライドする場合は、super.onCreate(savedInstance)に電話する必要があります。

このチェックは、カスタムインストルメンテーションが正しく動作することを確認するためのものです。私たちのカスタムアクティビティの中にいくつかのメソッドをsuperに呼び出すという要件は、実装の意図しない結果でした。

これは悪いOOP設計であるなぜの詳細に入るがなければ、私は、少なくともそれはちょうどあなたのonCreate()メソッドでsuper.onCreate(savedInstanceState)を呼び出すために十分に簡単だと言うことができます。コードから分かるように、悪影響はありません。

+0

悪い副作用は、NativeActivity.onCreate()メソッドから発生します。 Javaではsuper.superはありません。メソッドをオーバーライドするという点は、私が呼びたくないということです。 – paulscode

+0

@ user1002212私はあなたを理解しているかわかりません。 super.onCreate()を呼び出さないようにするのは個人的な要望ですか? – spatulamania

+0

それは何も個人的ではなく、要件です。上の質問で説明したように、私のクラスはActivityではなくNativeActivityを拡張しています。私はNativeActivity.onCreate(これは私がsuper.onCreateを呼び出すと起こる)を避けるために、NativyActivity.onCreateはコンテンツビューを設定します(これはやりたくありません)。 – paulscode