【问题标题】:In Android should each screen be its own Activity or layout?在 Android 中,每个屏幕应该是它自己的 Activity 还是布局?
【发布时间】:2011-06-22 16:33:51
【问题描述】:

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

目前,我将每个内容屏幕作为一个 Activity,它只调用 XML 布局(一些文本、按钮和图像)并添加一些 onClick 功能。

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

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

因此实现此功能的另一种方法是只使用几个活动(可能 1 个用于 MainMenu,1 个用于子菜单,1 个用于 ContentScreen)来确定要显示的布局。但是我觉得这意味着每个活动都有很多工作要做,而且我失去了按下后退按钮使用户通过菜单层次结构返回的功能(并且在每个屏幕上编写一个替换后退按钮会涉及一个庞大的 onClick 案例,涉及每个可能的布局,全部 89 个!)。

使用此应用程序的最佳方式是什么?

非常感谢任何帮助

【问题讨论】:

  • 你的应用是做什么的?那是很多内容屏幕。
  • 这是一个导游应用,所以每个酒店、餐厅、景点等都有一个内容页面......

标签: android android-activity android-layout


【解决方案1】:

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

后退按钮不会损坏,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);
    }
}

您的意思是:返回按钮不会损坏,Android 会跟踪您的积压?

当用户从活动移动到 活动,跨应用程序, Android系统保持线性 活动导航历史 用户访问过。这是活动 栈,也称为后栈。 一般来说,当用户开始一个新的 活动,它被添加到活动中 堆栈,以便按 BACK 显示 堆栈上的上一个活动。

(来自Activity and Task Design Guidelines

【讨论】:

  • 目前我有 27 个菜单的 1 个布局 XML 和 2 个行布局,这些在运行时填充。老实说,我可以对内容做同样的事情,我只是没想到!但是,如果我这样做,那么每个内容页面有 1 个活动不是最简单的吗? onCreate() 用适当的内容填充布局?最后,您的意思是:后退按钮不会损坏,Android 会跟踪您的积压工作?
  • 谢谢彼得里斯。最后我参加了“一些活动”。每种类型的菜单有 1 个活动(如果有图标或没有图标),每个内容页面有 1 个活动。我传递了为布局设置适当内容的意图。这样似乎容易多了!
【解决方案2】:

我不认为它会因为声明的活动数量而变慢。 但是,您可能应该跨活动重用您的一些布局:http://developer.android.com/resources/articles/layout-tricks-merge.html

【讨论】:

    【解决方案3】:

    您可以重复使用您的布局,并且可以使用 startAcitity 和 startActivityForResult 方法来管理活动的有效性。

    【讨论】:

      猜你喜欢
      • 2016-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-12
      • 2012-01-23
      • 1970-01-01
      相关资源
      最近更新 更多