2011-06-22 14 views
9

私は、27個のメニュー画面からアクセスできる、62個のコンテンツ画面の非常に単純なレイアウトを持つアプリを設計しています。合計で、これは89の活動です。Androidの各画面はそれぞれ独自のアクティビティまたはレイアウトですか?

現在のところ、各コンテンツ画面はXMLレイアウト(テキスト、ボタン、画像)を呼び出すだけのアクティビティであり、いくつかのonClick機能が追加されています。

各メニュー画面はListActivityであり、リスト内の各項目を押すと、その項目のアクティビティ(別のメニュー画面またはコンテンツ画面)が開きます。

現時点では、3つのメニュー画面とコンテンツ画面でテストしています。しかし、私はアプリを終了すると、それはあまりにも多くの活動をし、アプリを遅くして鈍いことになると懸念しています。アプリの平均的な使用では、ユーザーが10以上のアクティビティを使用するとは思っていませんでしたが、Androidが他の未使用アクティビティを作成することを予期しているかどうかはわかりません。

これを実装する別の方法は、表示するレイアウトを調整するだけのアクティビティ(メインメニューの場合は1、サブメニューの場合は1、ContentScreenの場合は1)を使用することです。しかし、これは、各アクティビティにはもっと多くの作業が必要であり、また、Backボタンを押してメニュー階層をバックアップする機能が失われることを意味すると思います。 onClickの大規模なケースがすべての可能なレイアウトを1つずつ含んでおり、そのうち89個すべてが含まれます)。

このアプリを使うにはどうすればいいですか?

すべてのヘルプは非常に

+1

あなたのアプリは何をしますか?それはコンテンツスクリーンのロットです。 – Matt

+0

これはツアーガイドアプリケーションなので、ホテル、レストラン、アトラクションなどのコンテンツページを持っています。 – Stu

答えて

2

メニューのアクティビティとコンテンツのアクティビティのレイアウトや動作が大きく異なる場合を除き、「ほんの数少ないアクティビティアプローチ」とします。

バックボタンが壊れないため、Androidはバックログを追跡します。

本当に89の異なるレイアウトが必要ですか?大部分が内容が異なる場合は、コンテンツをデータベースまたはファイルまたは/res/に格納し、実行時にレイアウトを再利用し、レイアウトのコンテンツ領域を埋めます。


更新:

それはのonCreate()が適切なコンテンツとレイアウトに記入していることをコンテンツページあたり1活性を有することが最も簡単ではないでしょうか?

あなたのonCreate()コードがどのように異なるかによって異なります。 onCreate()が巨大なswitchの62個の奇妙な数字のcaseの句になる場合、巨大なものではなく別々の小さなアクティビティを使う方がよいでしょう。 onCreate()コードを一般化することができ、それを例えば100行と10個の分岐ステートメントの下に保つことができれば、その方法になります。

例をあげると、私は試験問題のコレクションを持っている単純なアプリケーションを作成していて、ランダムにユーザーに提示していました。それぞれの質問には、質問文、イラスト、2-4回答の選択肢があります。約500の質問がありました。次に、データベースから質問を読み込んでレイアウトを更新するコードを示します。応答の数が可変であり、イラストを持たない質問の可能性があることに注意してください。

public void loadQuestion(int id) { 
    // Columns in questions table: 
    // CREATE TABLE questions (
    //   id integer, 
    //   q text, 
    //   a1 text, 
    //   a2 text, 
    //   a3 text, 
    //   a4 text, 
    //   a5 text, 
    //   correct integer, 
    //   img blob 
    // ); 

    Cursor c = mDatabase.rawQuery("SELECT * FROM questions where id=" + id, null); 
    c.moveToFirst(); 

    TextView text = (TextView) findViewById(R.id.text); 
    text.setText(c.getString(1)); 

    RadioGroup g = (RadioGroup) findViewById(R.id.answers); 
    g.clearCheck(); 

    // Load answers! 
    int correct = c.getInt(7); 
    int[] buttons = new int[] {R.id.a1, R.id.a2, R.id.a3, R.id.a4, R.id.a5}; 
    for (int i=0; i < 5; i++) { 
     String answerText = c.getString(i + 2); 
     RadioButton rb = (RadioButton) findViewById(buttons[i]); 
     if (answerText != null && answerText.length() > 0) { 
      rb.setText(answerText); 
      rb.setTag(i + 1 == correct ? "correct" : null); 
      rb.setVisibility(RadioButton.VISIBLE); 
     } else { 
      rb.setVisibility(RadioButton.GONE); 
     } 
    } 

    byte[] encoded = c.getBlob(8); 
    ImageView iv = (ImageView) findViewById(R.id.image); 
    if (encoded != null && encoded.length > 0) { 
     iv.setVisibility(ImageView.VISIBLE); 
     iv.setImageBitmap(bytesToBitmap(encoded)); 
    } else { 
     iv.setVisibility(ImageView.GONE); 
    } 
} 

あなたは何を意味するか:戻るボタンは中断されません、Androidはあなたのバックログを追跡しますか? 活動への活動からのユーザ移動すると

、アプリケーション間で、 Androidシステムは ユーザーが訪問した活動の線形 ナビゲーション履歴を保持します。これはバックスタックとも呼ばれるアクティビティ スタックです。 一般に、ユーザが新しい アクティビティを開始すると、アクティビティ スタックに追加されるため、BACKを押すと、スタック上の前のアクティビティが と表示されます。 (Activity and Task Design Guidelinesから)

+0

現在、27のメニューに1つのレイアウトXMLと2行のレイアウトがあり、実行時に埋められます。私は正直言ってコンテンツのために同じことをすることができた、私はそれについて考えていなかった! しかし、私がこのようにした場合、onCreate()で適切なコンテンツをレイアウトに埋め込むコンテンツページあたり1つのアクティビティを持つのが最も簡単でしょうか? 最後に、あなたは何を意味しますか?戻るボタンは壊れません。Androidはバックログを追跡していますか? – Stu

+0

@Stu:私の答えを更新しました –

+0

Peterisに感謝します。私は最後に「いくつかの活動」を行った。私はメニューのタイプごとに1つのアクティビティ(アイコンがあるかどうか)とコンテンツページごとに1つのアクティビティを持っています。私は、レイアウトの適切なコンテンツを設定するインテントを渡します。これはずっと簡単です! – Stu

0

レイアウトを再利用でき、startAcitityメソッドとstartActivityForResultメソッドを使用してアクティビティの有効性を管理できます。

関連する問題