2009-10-19 2 views
10

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

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

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

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

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

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

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

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

ответ

7

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

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

Когда значок, соответствующий человек, место или событие щелчка, он выстреливает в VIEW Intent на URI , соответствующий этому объекту; это , выбранный Управлением, которое затем показывает объект.

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

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

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

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

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

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

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

+0

ОК, я вижу, что если мы сохраним все намерения так же, как и активность Show, то обратные события обрабатываются точно так же. Таким образом, я предполагаю, что реальная сложность (и боль в пояснице) была бы, если бы мы программным образом отключили содержимое вкладок, а не запускали намерения. Например. вкладке «Люди», которая обычно отображает список людей, предлагается переключиться на представление «Показать человека», когда на него нажимается данное лицо. В таком случае нам придется иметь дело со стеком взглядов сами? – I82Much

+0

Кроме того, как можно иметь карту внутри вкладки без активности в качестве содержимого вкладки? Это возможно? – I82Much

+0

w/r/t ваш первый комментарий, да, вам нужно будет сделать собственное управление стеком. w/r/t ваш второй комментарий, да вы можете AFAIK. Сделайте свой основной вид деятельности MapActivity, а не TabActivity. Единственное, что TabActivity делает для вас, - это установка вызова() автоматически на TabHost, которую вам нужно будет сделать самостоятельно, прежде чем добавлять какие-либо TabSpec. Затем MapActivity дает вам то, что вам нужно для размещения карты на вкладке. Возможно, здесь есть проблемы, но с манжетой я думаю, что она должна работать нормально. – CommonsWare

8

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

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

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

Основы должны иметь макет, аналогичный таковому в учебнике 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; 
     } 
    })); 
} 

...

+0

Теперь, это отличный ответ! Спасибо Джошу, ты спас свой день. –

1

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

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

Смежные вопросы