3

MainActivityから「Login」クラスを拡張します。

MainActivityは次のようになります。

 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);
     }
}

ログインクラスの「super.oncreate」をコメントアウトしたことがわかります。ここでMainActivitysoncreateを再度呼び出すのは意味がありません。しかし、このコメントされた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にコメントしないと、多くの「ログイン」オブジェクト/アクティビティを作成する停止しないループが発生します。

どうすればこれを解決できますか?

4

4 に答える 4

4

Androidでは、アクティビティのライフサイクルを順守する必要があります。ライフサイクルメソッドをオーバーライドするたびに、アクティビティのライフサイクルとの整合性を確保するためにsuperを呼び出す必要があります。

ここでのポイントは、MainActivity.onCreateではなくActivity.onCreateを呼び出すことです。LoginActivity内のMainActivityの動作から継承したくない場合は、それを拡張しないでください。必要な動作のみをグループ化するには、中間の親共通親クラスが必要な場合があります。

于 2012-12-31T10:52:30.057 に答える
2

Activityをサブクラス化するときは、常にonCreate()スーパークラスメソッドを明示的に呼び出す必要があります。これにより、システムが適切に初期化できるため、スーパークラスonCreate()の呼び出しを削除できなくなります。

onCreate()一般に、別のアクティビティのメソッドでアクティビティを開始することはあまり良い考えではありません。ログインアクティビティを起動する他の方法を考えてみてください(たとえば、ログインアクティビティを起動するボタンを作成します)。

MainActivityの複数のサブクラスを計画している場合は、その中の一般的な動作とコンポーネントをカプセル化し、サブクラス(ログインアクティビティ)を直接起動します。LAUNCHERまたは、ログインアクティビティを最初に表示する場合は、でアクティビティにすることができますAndroidManifest.xml

活動のライフサイクルについてもっと読み、開発前にいくつかの理論を研究してください。

于 2012-12-31T10:54:05.360 に答える
0

ルールは、onCreate()をオーバーライドする場合は、super.onCreate()を呼び出す必要があります...実行できることは、次のようにMainActivityでsetContentView()を実行することです。setContentView(getCurrentViewLayoutId())およびgetCurrentViewLayoutId()は次のようになります。 LoginActivity.javaが実装するメソッド...このように、LoginActivity.javaからonCreate()実装を完全に削除できます。そうすれば、「super.onCreate()チェック」で問題が発生することはありません。ただし、onResume()でこのstartActivity呼び出しを実行することをお勧めします。

于 2012-12-31T10:55:17.067 に答える
0

ログイン用にMainActivityを拡張する特別な理由はありますか?

MainActivityでLoginインテントを呼び出しており、Loginはsuper.onCreate()を呼び出す必要があるため、無限ループになります。したがって、MainActivityではなくActivityを拡張する方が良いと思います。

于 2012-12-31T10:56:39.383 に答える