Проблема Android с инициализацией Tab

У меня проблема с просмотром вкладок на Android.

Я использую 4 файла макета xml (каждый из которых RelativeLayout) в качестве содержимого для вкладок в представлении вкладок.

В main.xml содержится: TabHost (@android:id/tabhost), содержащий linearLayout, который содержит TabWidget (@android:id/tabs) и FrameLayout (@android:id/tabcontent)

Если я вставляю несколько файлов один за другим в файл main.xml, все работает нормально... (за исключением того, что мой файл main.xml не поддерживается, и это проблема, которую я хочу решить, разделив файлы на простой файл main.xml, который определяет вкладку и фрейм содержимого, а затем переместите представления на это...).

Код, который я должен раздуть и вставить 4 XML-файла RelativeLayout в содержимое вкладки, выглядит следующим образом:

mTabHost = getTabHost();

View wv = null;
wv = LayoutInflater.from(this).inflate(R.layout.user_tab, mTabHost.getTabContentView(), true);
mTabHost.addTab(mTabHost.newTabSpec("User").setIndicator("User").setContent(wv.getId()));

wv = LayoutInflater.from(this).inflate(R.layout.track_tab, mTabHost.getTabContentView(), true);
mTabHost.addTab(mTabHost.newTabSpec("Track").setIndicator("Track").setContent(wv.getId()));

wv = LayoutInflater.from(this).inflate(R.layout.chart_tab, mTabHost.getTabContentView(), true);
mTabHost.addTab(mTabHost.newTabSpec("Chart").setIndicator("Chart").setContent(wv.getId()));

// И так далее для нескольких вкладок.

Когда я запускаю это, первая вкладка (Пользователь) пуста, а на остальных вкладках есть все содержимое из всех представлений... Итак, вкладка 2 имеет содержимое из вкладки 1-4, вкладка 3 имеет содержимое из вкладки 1-4, а вкладка 4 имеет содержимое из tab1-4... Возвращаясь к tab1, теперь он имеет все содержимое из tab1-4.

Код работает просто отлично, события для различных объектов в представлениях и т. Д. Все хорошо... Просто они все перемешаны в представлении...

Любые идеи о том, что вызывает это и как это исправить?

Заранее спасибо.

Джим


person Jim    schedule 02.07.2010    source источник


Ответы (2)


Любые идеи о том, что вызывает это и как это исправить?

Во-первых, заменить:

setContent(wv.getId())

с участием:

setContent(wv)

Во-вторых, заменить:

LayoutInflater.from(this).inflate(R.layout.user_tab, mTabHost.getTabContentView(), true);

с участием:

getLayoutInflater().inflate(R.layout.user_tab, mTabHost.getTabContentView(), false);

Ключом является false в третьем параметре.

person CommonsWare    schedule 02.07.2010
comment
Привет и спасибо за это. Приложение не будет компилироваться с помощью setContent(wv), так как оно утверждает, что setContent ищет идентификатор представления, оно компилируется с помощью setContent(wv.getId()). Реализация с ложным (и getId()) однако выдает ОШИБКУ/AndroidRuntime(224): Вызвано: java.lang.RuntimeException: Не удалось создать содержимое вкладки, поскольку не удалось найти представление с идентификатором 2131099653. Возврат к истине очищает эту ошибку, но возвращает меня к тому, с чего я начал. Я подозреваю, что вы правы в том, что ключ использует false при раздувании, но если я это сделаю, я не пройду мимо setContent... Любые другие идеи приветствуются. - person Jim; 03.07.2010
comment
@Jim: о, подождите, верно - вам нужно использовать такой загрузчик: github.com/commonsguy/cw-android/tree/master/Fancy/DynamicTab - person CommonsWare; 03.07.2010
comment
это классное решение ... выглядит хорошо ... Я также нашел альтернативу, которая работает с оригиналом. Я публикую это как второй ответ здесь - person Jim; 03.07.2010

Хорошо... Разобрался, почему оригинальный подход не работал... и исправил... Также отличное решение от @CommonsWare (Спасибо!)

Решение для исходного кода оказалось таким:

wv = getLayoutInflater().inflate(R.layout.user_tab, mTabHost.getTabContentView(), false);
mTabHost.getTabContentView().addView(wv);
mTabHost.addTab(mTabHost.newTabSpec("User").setIndicator("User").setContent(wv.getId()));

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

Итак, если я вызываю inflate с истинным значением, оно добавляется как дополнительное представление, но возвращает родительское представление (т.е. фрейм tabContent)... если это идентификатор, который я передаю в setContent, он помещает все объекты в это представление на экране... моя изначальная проблема.

Итак, но вызов с ложным создает представление, но пропускает добавление к родительскому этапу, однако критически важно, что он возвращает НОВОЕ представление. Итак, если я добавлю этот tabContentView в кадр с помощью:

mTabHost.getTabContentView().addView(wv);

А затем в setContent установите идентификатор для нового представления, c

Бинго: работает

Спасибо за помощь!

person Jim    schedule 03.07.2010
comment
Ошибка Джининга как Caused by: java.lang.RuntimeException: Could not create tab content because could not find view with id -1android - person Android; 18.04.2012
comment
Не забудьте убедиться, что корень каждого из ваших расширенных представлений вкладок также имеет уникальный идентификатор! - person kurtzmarc; 03.07.2013