2011-10-20 82 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

相关问题