Проблема с Android при инициализации Tab - PullRequest
2 голосов
/ 02 июля 2010

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

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

Основное.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 содержит содержимое из tab1-4, tab3 имеет содержание from tab1-4 и tab4 содержат содержимое tab1-4 ... Возвращаясь к tab1, теперь оно содержит все содержимое tab1-4.

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

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

Спасибозаранее.

Джим

Ответы [ 2 ]

0 голосов
/ 03 июля 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 с true, он добавляет add как вспомогательное представление, но возвращает родительское представление (т. Е. Фрейм tabContent) ... если это идентификатор, который я передаю setContent, он помещает все объекты в этом представлении на экране ... моя первоначальная проблема.

Таким образом, но вызов с false создает представление, но пропускает этап добавления к родительскому элементу, однако критически он возвращает представление NEW. Итак, если я добавлю этот tabContentView во фрейм с:

mTabHost.getTabContentView().addView(wv);

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

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

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

0 голосов
/ 02 июля 2010

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

Сначала замените:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...