8

У меня есть активность, определяемую:Как получить содержимое вкладки в TabHost?

<LinearLayout 
     android:id="@+id/TabContainer" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="99" 
     android:orientation="vertical"> 
    <TabHost 
     android:id="@+android:id/tabhost" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 
    <LinearLayout 
     android:id="@+id/TabLinearLayout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 
     <TabWidget 
     android:id="@+android:id/tabs" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"></TabWidget> 
     <FrameLayout 
     android:id="@+android:id/tabcontent" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_marginTop="10dp"></FrameLayout> 
    </LinearLayout> 
    </TabHost> 
</LinearLayout> 

В основном это TabHost с TextViews как содержание. Я строю вкладки и содержимое этих TextViews динамически с помощью createTabContent(). Это прекрасно работает. Но при некоторых обстоятельствах (некоторые события, обработанные AsyncTask с помощью TCP-сокета), мне нужно изменить содержимое некоторых из этих TextView.

Я убежден, что моя проблема - результат моей неопытности с Android SDK, но я не могу найти способ перебрать TabHost и получить контент для каждого из этих текстовых элементов.

«наиболее» подход, который я достиг является:

TabHost th = (TabHost) findViewById(android.R.id.tabhost); 
TabWidget tw = th.getTabWidget();  

for (int i = 0; i < tw.getChildCount(); i++) { 
    LinearLayout lLayout = (LinearLayout) tw.getChildAt(i); 
    TextView tv = ((TextView) lLayout.getChildAt(i));  

    tv.append(linea); 
} 

Но что это делает, чтобы добавить, что «Linea» к имени вкладки (на индикаторе). Я хочу добавить его в содержание этой вкладки, но я не могу найти способ получить связанный с ним TextView.

Любые идеи будут очень благодарны!

--------- --------- EDIT

Хотя в комментарии ниже я разместил, что у меня уже было решение, я узнал, что это не действует. Код теперь выглядит так:

for (int i = 0; i < tw.getChildCount(); i++) { 
    LinearLayout LLayout = (LinearLayout) tw.getChildAt(i); 
    TextView currenttab = (TextView) LLayout.getChildAt(0); 

    if (tab.equals(currenttab.getText())) { 
    th.setCurrentTab(i); 
    TextView tabContent = (TextView) th.getTabContentView().getChildAt(0); 
    tabContent.append(linea); 
    return true; 
    } 
} 

Проблема заключается в том, что getTabContentView() ссылка только на активную вкладку в данный момент, так что если я хочу, чтобы добавить текст к невыбранной вкладке TextView, я должен выберите это ранее с .setCurrentTab (i), что означает, что я буду менять активную вкладку ...

Я думаю, что это должно быть намного проще, чем я думаю ... Любая помощь с этим ?

Спасибо!

--------- --------- EDIT

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

Я попытался объявить карту, где первая строка - это имя вкладки, а вторая - это TextView, связанная с ее содержимым, и назначить их в момент создания вкладки. В результате я смог ссылаться только на TextView активной вкладки, другие - на исключение NullPointer.

Поэтому я сфокусировал проблему по-разному. Теперь, если мне нужно добавить текст в неактивную вкладку, я добавляю этот текст в Hash, я объявляю OnTabChangeListener, и каждый раз, когда я меняю вкладку, я отбрасываю в нее ожидающий контент.

Это не самое блестящее решение, но это единственный, с которым я работал ... так что если у кого-то есть лучшее решение, я буду благодарен.

ответ

0

Вкладки доступны через TabWidget:

yourTabHost.getTabWidget().getChildTabViewAt(position); 

Этот код возвращает вид любой вкладки, даже неактивного.

+0

В моем случае он возвращает RelativeLayout без необходимых элементов управления. – CoolMind

0

Сначала просмотрите всю вкладку с tabHost.getChildAt(n), а затем сделайте findViewById в виде вкладок, чтобы применить изменения.

Пример:

View tabView = tabHost.getChildAt(0); 
View myView = tabView.findViewById(R.id.myView); 
myView.setVisibility(View.INVISIBLE); 
0

@nKn, спасибо за getTabContentView(). В моем случае она возвращает не вкладку, а FrameLayout, содержащий все вкладки, а также следующие работы:

View tab = tabHost.getTabContentView().getChildAt(2); 
ImageView image = (ImageView) tab.findViewById(R.id.image); 
0

TabHost ребенок просмотров вкладки можно получить доступ через TabWidget метод getChildTabViewAt(position)

TabWidget tabWidget = tabHost.getTabWidget(); 

    for (int i = 0; i < tabWidget.getTabCount(); i++) { 

     View parentView = tabWidget.getChildTabViewAt(i); 

    } 

И выбран вид вкладки можно получить по адресу:

View parentView = tabHost.getCurrentTabView(); 
Смежные вопросы