47

条件に基づいてAndroidの開始アクティビティを動的に変更する方法はありますか?私がやろうとしたこと(それはうまくいきませんでした)は次のとおりでした:

  1. AndroidManifest.xmlで定義されているLAUNCHERカテゴリを削除します
  2. アプリが使用するカスタムアプリケーションクラスを作成する
  3. ApplicationクラスのonCreateメソッドをオーバーライドして、次のようなコードを定義します。

if (condition) {
    startActivity(new Intent(this, MenuActivity.class));
} else {
    startActivity(new Intent(this, LoginActivity.class));
}
4

2 に答える 2

59

UIのない​​イニシャルActivityを使用して、その状態をチェックしonCreate、次を起動して、それ自体Activityを呼び出すのはなぜですか?finish()私はfinish()内部から電話をかけたことonCreate()がないので、これがうまくいくかどうかはわかりません。

編集
正常に動作しているようです。わかりやすくするためのコードを次に示します。
イニシャルActivity

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Intent intent;
    if (condition) {
       intent = new Intent(this, ClassA.class);
    } else {
       intent = new Intent(this, ClassB.class);
    }
    startActivity(intent);
    finish();
    // note we never called setContentView()
}

その他Activity

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
}
于 2011-01-31T21:58:28.553 に答える
8

これが私の小さなモバイルプロジェクトの1つで私が個人的にしたことです。条件があり、対応する画面を起動する別の画面のない場所を作成する代わりにActivity、条件を1つに入れて、次のようにActivity動的setContentView()に実行しました。

if (!userIsLoggedIn) {
    setContentView(R.layout.signup);
} else {
    setContentView(R.layout.homescreen);
}

このアプローチに対する2つの重要な注意事項:

1:それを書く代わりに、画面を前面に表示する必要があるときはいつでも後者が常に呼び出されるためonCreate()、意思決定を正確に内部に配置する必要があります。これは、AndroidのアクティビティライフサイクルonResume()からわかります。たとえば、ユーザーが私のアプリをダウンロードして初めて起動した場合、ログインしているユーザーがいないため、ユーザーはサインアップページに移動します。サインアップが完了し、何らかの理由でボタン(ではなく、アプリを完全に終了します)を押してからアプリを再開すると、彼女に表示されるレイアウトはすでにホーム画面になっています。条件付きを中に入れると、ライフサイクルに応じて元に戻らないため、サインアップ画面が表示されます。HOMEBACKonCreate()onCreate()アプリを前面に戻すとき。

2:このソリューションは、これら2つのアクティビティの機能をマージしても、長い悪魔的なコードブロックが生成されない場合にのみ理想的です。私が言ったように、私のプロジェクトは小さなものでした(その主な機能はバックグラウンドで発生します)ので、単一のダイナミクスActivityにはあまり多くはありませんでした。Activityコードをより人間が読めるようにする必要がある場合は、スクリーンレスが間違いなく最適な方法です。

于 2012-08-03T12:29:37.383 に答える