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

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

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