launchModes, singleTask: как переключаться между «экранами»? Является ли Intents единственным способом, и если да, то я думаю, что у меня есть проблема - PullRequest
2 голосов
/ 09 января 2010

В ряде вопросов (, как этот ) я изучал, как "менять экраны" в моем приложении. У меня есть "заголовок" сверху, с 4 кнопками. Каждая кнопка предназначена для замены «контента» (т.е. экрана изменения):

+--------------------+
| menu with buttons  |
+--------------------+
|                    |
|                    |
|  C O N T E N T     |
|                    |
|                    |
+--------------------+

Когда я нажимаю кнопку меню, я запускаю следующий код:

@Override
public void onClick(View v)
{
    Intent myIntent = new Intent(BaseActivity.this, ActivityMain.class);
    BaseActivity.this.startActivity(myIntent);
}

Как видите, startActivity выполняется. Теперь, если я не укажу "launchMode" для Activity, это означает, что launchMode = normal. Если launchMode == normal, это означает, что Activity будет заново создаваться каждый раз, когда я перемещаюсь, используя верхние кнопки заголовка, и это означает, что все данные, введенные в «элементы формы», ушли (или, по крайней мере, скрыты).

Итак, я нашел режим запуска "singleTask", который звучал довольно мило. Если я добавлю этот launchMode в свою активность, он не будет воссоздан при навигации по кнопкам, сохраняя состояние. Большой! Ну, пока я не прочитал это :

Как отмечалось выше, никогда не бывает более одного экземпляра действия "singleTask" или "singleInstance", поэтому ожидается, что экземпляр будет обрабатывать все новые намерения.

Я обнаружил, что это предложение означает, что может быть только одна Activity, для которой launchMode установлен в "singleTask" - если у меня более одного, она не будет работать (хотя ошибки компилятора нет).

Это означает, что я могу «сохранять состояние» только для одного занятия при переключении между экранами и обратно (*)

Еще раз , это действительно так должно работать?

Ответы [ 3 ]

2 голосов
/ 09 января 2010

Кажется, вы заставляете действия существовать там, где их не должно быть.

Если вы собираетесь использовать кнопки в качестве искусственных вкладок, тогда должно быть одно действие, никаких вызовов startActivity(), и используйте ViewFlipper или FrameLayout или что-то еще, чтобы изменить содержимое в соответствии с кнопкой. В конце концов, именно так работают вкладки, и только потому, что вы решаете не использовать TabHost / TabActivity, а использовать свою собственную систему вкладок, подход к дизайну должен быть таким же.

0 голосов
/ 09 января 2010

Вы пытаетесь решить свою проблему простым способом, но как быть, когда пользователь меняет ориентацию и ваша деятельность возобновляется? Разве это не уничтожит форму? Попытайся. Я думаю, что вам нужно посмотреть на сохранение состояния формы в комплекте. С Android ваши действия должны предполагать, что они могут быть перезапущены в любое время. Смотрите ниже ТАК сообщение:

Сохранение состояния активности Android с помощью Save Instance State

0 голосов
/ 09 января 2010

Как отмечалось выше, больше никогда не бывает чем один экземпляр "SingleTask" или "singleInstance", так что ожидается, что экземпляр будет обрабатывать все новые намерения. * * 1002

это означает один экземпляр действия, в котором вы установили «singleTask» или «singleInstance». если у вас есть два действия с этим параметром, это будет означать, что у вас есть только два экземпляра. в основном установите его на сколько угодно занятий, если вы понимаете, что делаете.

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