2011-01-31 26 views
43

条件に基づいてAndroidの起動アクティビティを動的に変更する方法はありますか?私は(動作しませんでしたこと)を行うことを試みは、以下の通りであった:Androidの動的開始アクティビティですか?

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

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

私は何を検索したのですか、これはすでにお問い合わせいただきありがとうございます。 – mad

答えて

56

なぜ、その後、その後、次のActivity起動自体にfinish()呼び出して、そのonCreateで状態を確認していないUIとの初期Activityを持っていませんか?私はをonCreate()から一度も呼び出さなかったので、これがうまくいくかどうかは分かりません。

EDIT
が正常に動作するようです。明確にするためのコードがいくつかあります。
初期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); 
} 
+0

UIを持たないアクティビティはありますか?私は、アクティビティの全体がユーザーに何かを表示することだと思っていましたが、おそらく私はAndroidの基本についていくつか再読する必要があります... –

+1

@Matt Huggins私はちょうど私のスクラッチワークスペースでそれを試して、それは正常に動作するようです。 –

+1

それは活動の全体のポイントですが、これを回避する方法はたくさんあります。私は、デイヴが意味していたことはUIを宣言していないと思った。 setContentViewなどを呼び出す必要はありません。あなたの小切手をして、あなたの次の活動を開始し、それに乗ってください。 – Falmarri

8

ここで私は個人的に私の小さなモバイルプロジェクトの一つのためにやったことです。代わりに作成するので独立し、スクリーンレスの状態であり、対応する画面を起動したActivity、私は1つActivityに条件を入れてのように、ダイナミックsetContentView()をした:このアプローチに

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

二つの重要な注意事項:

1:これをonCreate()に書き込む代わりに、onResume()の中に意思決定を入れたいと思うのは、画面を前面に表示する必要があるときは常に後者が常に呼び出されるからです。あなたはAndroid activity life cycleからそれを見ることができます。たとえば、ユーザーがログインしていないため、初めてユーザーが自分のアプリをダウンロードして初めて起動した場合、サインアップページに移動します。彼女が申し込みを終えて何らかの理由でボタンを押すと(アプリを一度終了したBACKではなく)、アプリを再開すると、表示されるレイアウトはすでにホーム画面になっています。私が条件付きのonCreate()を入れた場合、ライフサイクルに応じて、アプリを前面に戻すときにはonCreate()に戻らないため、サインアップ画面が表示されます。

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

+3

+1)。 :)既に述べたように、この方法の私の唯一の懸念は、それぞれのビューが大きく異なるコードを必要とすることで、アクティビティがかさばり、不自然になることです。 –

+1

@MattHugginsこのソリューションは、 'contentView'と' '大きく異なるコードセット 'をカプセル化する' Fragment'sを使うと、おそらく最も効果的です。 – TWiStErRob

関連する問題