在Android中,每个屏幕应该是自己的Activity还是布局?

Stu*_*Stu 10 android android-layout android-activity

好的我正在设计一个应用程序,它具有62个内容屏幕的非常简单的布局,可通过27个菜单屏幕访问.总共有89项活动.

目前,每个内容屏幕都是一个只调用XML布局(一些文本,按钮和图像)的Activity,并添加了一些onClick功能.

每个菜单屏幕都是一个ListActivity,按下列表中的每个项目将打开该项目的活动(无论是另一个菜单屏幕还是内容屏幕).

目前我正在使用3个菜单屏幕和一个内容屏幕进行测试.很好地滚动它们所有,但我担心当我完成应用程序时,它将有太多的活动,并使应用程序缓慢和slugish.在应用程序的平均使用中,我想用户将使用不超过10个活动,但我不确定Android是否会预期创建其他未使用的活动或什么.

因此,实现这一目标的另一种方法是只有几个活动(MainMenu可能为1,subMenu为1,ContentScreen为1)可以确定要显示的布局.但是我觉得这意味着每个Activity都有很多工作要做,而且我失去了按下Back按钮的功能,让用户通过菜单层次结构备份(并将替换后退按钮编码到每个屏幕上)涉及onClick的大量案例涉及每一个可能的布局,所有89个!).

这个应用程序的最佳方式是什么?

很感谢任何形式的帮助

Pēt*_*une 2

除非菜单活动和内容活动之间的布局和行为存在显着差异,否则我会采用“仅少数活动方法”。

后退按钮不会损坏,Android 会跟踪您的积压工作。

您真的需要 89 种不同的布局吗?如果主要是内容,它们之间有什么不同,请将内容存储在数据库或文件中/res/,重用布局并在运行时填充布局的内容区域。


更新:

每个内容页有 1 个活动,在 onCreate() 中用适当的内容填充布局不是最简单吗?

取决于您的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);
    }
}
Run Code Online (Sandbox Code Playgroud)

您所说的“后退按钮不会损坏,Android 会跟踪您的积压工作”是什么意思?

当用户跨应用程序从一个活动移动到另一个活动时,Android 系统会保留用户访问过的活动的线性导航历史记录。这就是活动堆栈,也称为返回堆栈。一般来说,当用户启动一个新活动时,它会被添加到活动堆栈中,以便按“BACK”键显示堆栈上的上一个活动。

(来自活动和任务设计指南