В Android каждый экран должен иметь свою активность или макет? - PullRequest
10 голосов
/ 22 июня 2011

Хорошо. Я проектирую приложение, которое имеет очень простую компоновку из 62 экранов контента, доступ к которым осуществляется через 27 экранов меню.В общей сложности это 89 действий.

На данный момент у меня есть каждый Экран контента, который представляет собой действие, которое просто вызывает макет XML (некоторый текст, кнопки и изображение) и добавляет некоторые функции onClick.

Каждый экран меню представляет собой ListActivity, и нажатие каждого элемента в списке открывает действие этого элемента (будь то другой экран меню или экран содержимого).

В данный момент я тестирую его с 3 экранами меню и содержимым.экран.Это хорошо, просматривая их все, но я обеспокоен тем, что, когда я закончу приложение, оно будет иметь слишком много действий и сделает приложение медленным и вялым.При обычном использовании приложения я предполагаю, что пользователь будет использовать не более 10 действий, но я не уверен, что Android будет ожидать создания других неиспользуемых действий или что-то подобное.

Так что другим способом реализации этого было быиметь только несколько операций (может быть 1 для MainMenu, 1 для subMenu и 1 для ContentScreen), которые просто решают, какой макет отображать.Тем не менее, я чувствую, что это будет означать, что у каждого действия есть намного больше работы, а также я теряю функциональность, нажимая кнопку «Назад», возвращая пользователя обратно через иерархию меню (и кодирование кнопки «Назад» замены на каждом экране будетзадействовать массивный кейс для onClick, включающий все возможные макеты, все 89 из них!).

Какой лучший способ использовать это приложение?

Любая помощь очень ценится

Ответы [ 3 ]

2 голосов
/ 22 июня 2011

Если макеты и поведение значительно не различаются между действиями в меню и действиями с контентом, я бы выбрал «подход с несколькими действиями».

Кнопка «Назад» не сломается, 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 ведет линейную навигационную историю действий, которые посетил пользователь.Это стек действий, также известный как задний стек.Обычно, когда пользователь запускает новое действие, оно добавляется в стек действий, поэтому нажатие НАЗАД отображает предыдущее действие в стеке.

(из Рекомендации по проектированию действий и задач)

0 голосов
/ 22 июня 2011

вы можете повторно использовать макет и использовать методы startAcitity и startActivityForResult для управления эффективностью действий.

0 голосов
/ 22 июня 2011

Не думаю, что это станет медленным только из-за количества заявленных действий. Однако вам, вероятно, следует повторно использовать некоторые макеты для разных видов деятельности: http://developer.android.com/resources/articles/layout-tricks-merge.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...