Android - вкладки, MapView, действия в вкладках
В настоящее время мы создаем приложение с 4 вкладками: "Карта", "Люди", "Места", "События". Люди, места и события в приложении отображаются как значки на карте. По умолчанию на вкладках "Люди", "Места" и "События" отображаются списки, индивидуально отображаемые, отображающие все Люди, Места и События соответственно.
alt text http://web6.twitpic.com/img/37202700-f92052dc474b74e1760edda1c47f6940.4adcb134-scaled.png
Теперь, сейчас каждая вкладка имеет в своем содержании набор намерений для запуска соответствующей активности. Например, есть MapTabActivity, который расширяет MapActivity, ShowPeopleListActivity, который показывает людей и т.д. И т.д.
Я вижу лот qaru.site/info/509949/... questions/ответы, говорящие, что из-за различных ограничений в способе настройки TabHost лучше не использовать действия в качестве содержимого вкладок. Например, невозможно запустить новое действие и заменить его существующей деятельностью на вкладке, тогда как можно отключить представление с другим видом.
Теперь я на распутье. Мы (к лучшему или худшему) посвятили много времени, пытаясь заставить это приложение работать так, как оно было в настоящее время структурировано, с Акциями как содержанием вкладок. Когда нажимается значок, соответствующий лицу, месту или событию, он запускает VIEW Intent на URI, соответствующий этому объекту; это получает активность, которая затем показывает объект. Тот же механизм работает как на Карте, так и в отдельных списках. Нам очень нравится свободное соединение, которое это дает нам; мы просто предоставляем команду VIEW и URI человеку/месту/событию, и это автоматически приводит нас к правильной деятельности. Конечно, запущенная деятельность закрывает представление вкладки, а не появляется внутри этого, но мы были готовы жить с этим.
Здесь проблема: из шоу-активности мы хотим иметь возможность вернуться к карте, сосредоточенной на этом человеке, месте или событии. Мы можем запустить новую активность, чтобы снова отобразить карту, но теперь у нас есть активность карты как содержимое вкладки, а также активность шоу, а также новая активность карты в стеке действий; учитывая, насколько ресурсоемким является активность карты, я предполагаю, что это не идеальный способ пойти.
Я думаю, мой вопрос в том, есть ли полезный учебник где-то, где точно показано, как выполнять сложные задачи с помощью TabHost? Я видел HelloTabWidget; Я ищу что-то гораздо более сложное, чем это. Я волнуюсь, что если мы перейдем к способу делать вид на основе View, нам нужно будет сделать много домашнего хозяйства, чтобы перехватить все задние события, попытаться отключить просмотры и т.д. И т.д., А также решительно связывая нашу программу так, как мы этого не хотим.
Любые предложения по продвижению вперед будут чрезвычайно оценены. Мы новичок в Android, поэтому мы стараемся следовать установленным лучшим практикам, но это трудно, когда несколько примеров, которые мы видели, слишком упрощены для нашего использования.
Ответы
Ответ 1
Я вижу много StackOverflow вопросы/ответы, в которых говорится, что различные ограничения в способе TabHost настроен, лучше не использовать как содержимое вкладок.
Являясь самозваным президентом Альянса Anti-Activity-Tab (AATA), это, безусловно, моя позиция.
Когда значок, соответствующий Человек, место или событие щелкнули, это уклоняется от намерения VIEW в URI соответствующий этому объекту; это подхваченный деятельностью, которая затем показывает объект.
Обратите внимание, что это не имеет никакого отношения к тому, что в качестве вкладок отображаются вкладки.
Мы можем запустить новую активность, чтобы показать карту снова, но теперь у нас есть карта активность как содержимое вкладки, плюс шоу-активность, а также новые активность карты в стеке действий; учитывая, насколько ресурсоемкая карта деятельность, я предполагаю, что это не идеальный способ пойти.
Я бы избегал этого, если это возможно.
Я беспокоюсь, что если мы перейдем к Посмотрите, как вести себя, мы будем должны сделать много домашнего хозяйства для перехватите все задние события, попробуйте отключить представления и т.д. и т.д., так как а также тесно связать нашу программу таким образом, мы не хотим.
Это вовсе не означает, что вы писали ранее. Ваши "задние события" не изменят ни одной точки между использованием "Представлений" в качестве содержимого вкладок и использованием "Действия" в качестве содержимого вкладок. Кроме того, это не имеет никакого отношения к шаблону "свободной связи", который вы описываете, - щелчок на значке в списке в представлении на вкладке не отличается от нажатия на значок в списке в представлении в действии в вкладку.
Просто сообщите своему активу "Показать", чтобы ваше, um, основное мероприятие показывало конкретное местоположение, тогда активность "Показать" может finish()
. Самый простой способ сделать это без введения жесткой JVM-связи между действиями - это трансляция Intent
и регистрация a BroadcastReceiver
в основном действии. После получения этого Intent
основное действие будет обновлять карту и устанавливать ее как текущую вкладку. Разумеется, этот подход проще, если у вас есть основная активность, использующая Views для содержимого вкладки.
Теперь, если вы попытаетесь провести капитальный ремонт своего приложения, так что переход на вкладку не запускает другую активность, а скорее сохраняет вещи внутри своей вкладки... это цельный "орех чайник".
Ответ 2
Хорошей практикой является одно действие и несколько просмотров для ваших вкладок. Однако это означает, что вам нужно быть осторожным, чтобы обрабатывать выбранную вкладку, различные меню и контекстные меню для каждого вида табуляции и т.д.
Я думаю, мой вопрос: есть ли Хороший учебник, где-то показывающий как выполнять сложные задачи с помощью TabHost? Я видел HelloTabWidget; я ищу что-то гораздо больше сложнее, чем это.
Я написал немного лучший учебник в своем блоге, который демонстрирует взаимодействующие элементы ListView и MapView в качестве вкладок. Здесь ссылка: вкладки Android с интерактивной картой и списками просмотров
Основа состоит в том, чтобы иметь макет, подобный таковому в учебнике 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;
}
}));
}
...
Ответ 3
Например, невозможно начать новую деятельность и принять ее место существующей деятельности в пределах вкладки, тогда как выключить вид с другим вид.
Я не думаю, что это невозможно. Я экспериментировал с этой идеей и написал статью статью, объясняющую, что я сделал. Я включаю пример кода проекта в конце статьи, который демонстрирует некоторые интересные вещи, которые я узнал.