Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: JimОтветов: 2

У меня проблема с просмотром вкладок на 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.

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

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

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

Джим

androidtabs

Ответы

Ответ 1 · CommonsWare

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

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 в третьем параметре.

Ответ 2 · Jim

Хорошо... Разобрался, почему оригинальный подход не работал... и исправил... Также отличное решение от @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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы