Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 不使用super.oncreate()停止循环并扩展MainActivity_Java_Android_Oncreate - Fatal编程技术网

Java 不使用super.oncreate()停止循环并扩展MainActivity

Java 不使用super.oncreate()停止循环并扩展MainActivity,java,android,oncreate,Java,Android,Oncreate,我从MainActivity扩展了一个“Login”类 main活动如下所示: public class MainActivity extends FragmentActivity { /** Called when the activity is first created. */ private static String TAG = "MainActivity"; @Override public void onCreate(Bundle savedInstanceState) {

我从MainActivity扩展了一个“Login”类

main活动如下所示:

 public class MainActivity extends FragmentActivity {
/** Called when the activity is first created. */
private static String TAG = "MainActivity";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //setContentView(R.layout.main);

    Intent login_activity = new Intent(this, Login.class);
    startActivity(login_activity);
    Log.d(TAG,"Login created");
}
}
在login.class中,我只是调用布局:

public class Login extends MainActivity {

@Override
public void onCreate(Bundle savedInstanceState) {
    //super.onCreate(savedInstanceState);
    setContentView(R.layout.login);
     }
}
您可以看到,我在login类中注释掉了“super.oncreate”。再次在此处调用MainActivitys oncreate是没有意义的。但是,如果这超过了super.oncreate,我会得到一些例外:

12-31 11:37:47.688: E/AndroidRuntime(4206): FATAL EXCEPTION: main
12-31 11:37:47.688: E/AndroidRuntime(4206): android.app.SuperNotCalledException: Activity {de.svennergr.htn/de.svennergr.htn.Login} did not call through to super.onCreate()
12-31 11:37:47.688: E/AndroidRuntime(4206):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2146)
12-31 11:37:47.688: E/AndroidRuntime(4206):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
12-31 11:37:47.688: E/AndroidRuntime(4206):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
12-31 11:37:47.688: E/AndroidRuntime(4206):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
12-31 11:37:47.688: E/AndroidRuntime(4206):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-31 11:37:47.688: E/AndroidRuntime(4206):     at android.os.Looper.loop(Looper.java:137)
12-31 11:37:47.688: E/AndroidRuntime(4206):     at android.app.ActivityThread.main(ActivityThread.java:5039)
12-31 11:37:47.688: E/AndroidRuntime(4206):     at java.lang.reflect.Method.invokeNative(Native Method)
12-31 11:37:47.688: E/AndroidRuntime(4206):     at java.lang.reflect.Method.invoke(Method.java:511)
12-31 11:37:47.688: E/AndroidRuntime(4206):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
12-31 11:37:47.688: E/AndroidRuntime(4206):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
12-31 11:37:47.688: E/AndroidRuntime(4206):     at dalvik.system.NativeStart.main(Native Method)
当我不注释super.oncreate时,我将得到一个不停止的循环,创建许多“登录”对象/活动


如何解决这个问题?

在Android中,您必须遵守活动的生命周期。每次重写生命周期方法时,必须调用super以确保与活动生命周期的一致性


这里的要点不是调用MainActivity.onCreate,而是调用Activity.onCreate。如果您不想继承LoginActivity内部MainActivity的行为,那么不要从中进行扩展。可能您需要一个中间父级公共父级类来仅对所需的行为进行分组。

在对活动进行子类化时,您必须始终显式调用onCreate()超类方法,这样系统才能正确初始化它,这样您就不能仅仅取消对onCreate()超类的调用

在另一个活动的
onCreate()
方法中启动一个活动通常不是一个好主意。只需考虑启动登录活动的其他方式(例如,制作一个启动按钮)

如果您计划拥有MainActivity的多个子类,只需将常见行为和组件包含在其中,并直接启动子类(登录活动)。或者,如果希望登录活动出现在开头,可以将其设置为
AndroidManifest.xml
中的
启动器
活动


请在开发之前阅读更多相关内容并学习一些理论。

规则是,如果重写onCreate(),则必须调用super.onCreate()…您可以做的是在主活动上设置ContentView(),如下所示:setContentView(getCurrentViewLayoutId())和getCurrentViewLayoutId()将是LoginActivity.java将实现的方法…像这样,您可以从LoginActivity.java中完全删除onCreate()实现。这样,“super.onCreate()检查”就不会有任何问题。但是在onResume()中执行这个startActivity调用可能是个好主意。

是否有任何特定的理由扩展登录的MainActivity


由于您在MainActivity中调用登录意图,并且登录需要调用super.onCreate(),因此它将进入无限循环。因此,我认为最好是扩展Activity而不是MainActivity。

为什么要启动MainActivity?开始直接登录活动…以后,我想检查MainActivity中的一些内容以开始正确的活动。例如,当用户已经登录时,我将启动另一个活动。我们这里不是在谈论构造函数。好的,onCreate是在Activities生命周期中调用的第一个方法,但它不是构造函数。对不起,你完全正确,编辑了我的答案,我的意思是调用super.onCreate()方法。