Android – вкладки, MapView, действия в пределах вкладок

Мы находимся в процессе написания приложения с 4 вкладками: «Карта», «Люди», «Места», «События». Люди, места и события в приложении отображаются как значки на карте. По умолчанию на вкладках «Люди», «Места» и «События» отображаются списки, индивидуальные визуализации, отображающие все Люди, Места и События соответственно.

Alt text http://web6.twitpic.com/img/37202700-f92052dc474b74e1760edda1c47f6940.4adcb134-scaled.png

Теперь, прямо сейчас каждая из вкладок имеет в своем содержании набор намерений для запуска соответствующей активности. Например, есть MapTabActivity, который расширяет MapActivity, ShowPeopleListActivity, который показывает людей и т. Д. И т. Д.

Я вижу много вопросов / ответов StackOverflow, говорящих, что из-за различных ограничений в способе настройки TabHost лучше не использовать действия в качестве содержимого вкладок. Например, невозможно запустить новое действие и заменить его на существующую активность на вкладке, тогда как можно переключить вид с другим видом.

Теперь я на распутье. Мы (к лучшему или худшему) посвятили много времени, пытаясь заставить это приложение работать так, как оно в настоящее время структурировано, с Акциями как содержанием вкладок. При щелчке значка, соответствующего лицу, месту или событию, он запускает VIEW Intent на URI, соответствующий этому объекту; Это получает активность, которая затем показывает объект. Тот же механизм работает как на Карте, так и в отдельных списках. Нам очень нравится свободная связь, которая дает нам; Мы просто предоставляем команду VIEW и URI человеку / месту / событию, и это автоматически приводит нас к правильной деятельности. Конечно, запущенная деятельность закрывает представление вкладки, а не появляется внутри этого, но мы были готовы жить с этим.

Вот проблема: из шоу-активности мы хотим вернуться к карте, сосредоточенной на этом человеке, месте или событии. Мы можем запустить новое действие, чтобы снова отобразить карту, но теперь у нас есть активность карты как содержимое вкладки, а также активность шоу, а также новая активность карты в стеке действий; Учитывая, насколько ресурсоемким является активность карты, я предполагаю, что это не идеальный способ.

Я думаю, мой вопрос в том, есть ли полезный учебник где-нибудь, показывающий, как выполнять сложные задачи с помощью TabHost? Я видел HelloTabWidget ; Я ищу что-то гораздо более сложное, чем это. Я волнуюсь, что если мы перейдем к способу ведения дел, основанному на взгляде, нам нужно будет много работать, чтобы перехватить все задние события, попытаться отключить просмотры и т. Д. И т. Д., А также Сильно связывая нашу программу так, как мы этого не хотим.

Любые предложения по продвижению вперед будут чрезвычайно оценены. Мы новичок в Android, поэтому стараемся следовать установленным передовым практикам, но трудно, когда несколько примеров, которые мы видели, слишком упрощены для нашего случая использования.

Я вижу много вопросов / ответов StackOverflow, говорящих, что из-за различных ограничений в способе настройки TabHost лучше не использовать действия в качестве содержимого вкладок.

Как самозанятый президент Альянса по борьбе с атакой (ААТА), это, безусловно, моя позиция.

При щелчке значка, соответствующего лицу, месту или событию, он запускает VIEW Intent на URI, соответствующий этому объекту; Это получает активность, которая затем показывает объект.

Обратите внимание, что это не имеет никакого отношения к тому, что действия отображаются в виде вкладок.

Мы можем запустить новое действие, чтобы снова отобразить карту, но теперь у нас есть активность карты как содержимое вкладки, а также активность шоу, а также новая активность карты в стеке действий; Учитывая, насколько ресурсоемким является активность карты, я предполагаю, что это не идеальный способ.

Я бы избегал этого, если это возможно.

Я волнуюсь, что если мы перейдем к способу ведения дел, основанному на взгляде, нам нужно будет много работать, чтобы перехватить все задние события, попытаться отключить просмотры и т. Д. И т. Д., А также Сильно связывая нашу программу так, как мы этого не хотим.

Это не следует из того, что вы писали ранее. Ваши «задние события» не изменят ни одну точку между использованием «Представлений» в качестве содержимого вкладок и использованием «Действия» в качестве содержимого вкладок. Кроме того, это не имеет никакого отношения к шаблону «свободной связи», который вы описываете, – щелчок по значку в списке в виде на вкладке не отличается от нажатия на значок в списке в представлении в действии в Вкладку.

Просто сообщите своему активу «Показать», чтобы ваше, um, основное мероприятие показывало конкретное местоположение, затем действие «Показать» может finish() . Самый простой способ сделать это без введения жесткой JVM-связи между действиями – это трансляция Intent и регистрация BroadcastReceiver в основном действии. После получения этого Intent основное действие будет обновлять карту и устанавливать ее как текущую вкладку. Разумеется, этот подход проще, если у вас есть основной вид активности для представления содержимого вкладки.

Теперь, если вы попытаетесь перестроить свое приложение, так что переход на вкладку не запускает другую активность, а скорее сохраняет вещи внутри своей вкладки … это целый «ореховой чайник».

Хорошая практика – иметь одну активность и несколько просмотров для ваших вкладок. Однако это означает, что вы должны быть осторожны, чтобы обрабатывать выбранную вкладку, различные меню и контекстные меню для каждого вида вкладок и т. Д.

Я думаю, мой вопрос в том, есть ли полезный учебник где-нибудь, показывающий, как выполнять сложные задачи с помощью TabHost? Я видел HelloTabWidget; Я ищу что-то гораздо более сложное, чем это.

Я написал немного лучший учебник в своем блоге, который демонстрирует взаимодействующие элементы ListView и MapView в качестве вкладок. Вот ссылка: Android Tabs с интерактивной картой и списком просмотров

Основы должны иметь макет, аналогичный таковому в учебнике HelloTabWidget, чтобы ваша деятельность расширялась из MapActivity, извлекала tabhost из XML и не заставляла вызывать setup () на tabhost. После этого добавление просмотров как содержимого вкладок, вкладчиков и т. Д. Одинаково.

Вот краткая начальная точка для класса:

 public class TabbedListMapActivity extends MapActivity { private ListView listView; private MapView mapView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tabHost = (TabHost) findViewById(android.R.id.tabhost); // setup must be called if not a TabActivity tabHost.setup(); // setup list view listView = (ListView) findViewById(R.id.list); // setup map view mapView = (MapView) findViewById(R.id.mapview); // add views to tab host tabHost.addTab(tabHost.newTabSpec("List").setIndicator("List").setContent(new TabContentFactory() { public View createTabContent(String arg0) { return listView; } })); tabHost.addTab(tabHost.newTabSpec("Map").setIndicator("Map").setContent(new TabContentFactory() { public View createTabContent(String arg0) { return mapView; } })); } 

Например, невозможно запустить новое действие и заменить его на существующую активность на вкладке, тогда как можно переключить вид с другим видом.

Я не думаю, что это невозможно. Я экспериментировал с этой идеей и написал статью в блоге, объясняющую, что я сделал. Я включаю пример кода проекта в конце статьи, который демонстрирует некоторые интересные вещи, которые я узнал.