Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get the content of a Tab within a TabHost?

I have an Activity defined by:

<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>

Basically it's a TabHost with TextViews as contents. I'm building the tabs and the content of those TextViews dynamically with createTabContent(). That works fine. But under some circumstances (some events processed by an AsyncTask with a TCP socket), I need to change the content of the some of those TextViews.

I'm convinced my problem is the result of my inexperience with Android SDK, but I can't find a way to iterate over the TabHost and get the content for each of those TextViews.

The "closest" approach I have achieved is:

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);
}

But what this does is to append that "linea" to the name of the tab (to the Indicator). I want to add it to the content of that tab, but I can't find a way to retrieve the TextView associated to it.

Any ideas will be very appreciated!

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

Although in a comment below I posted that I already had a solution, I found out it's not valid. The code looks now like this:

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;
  }
}

The problem is that getTabContentView() references only to the active Tab at that moment, so if I want to add some text to a non-selected tab's TextView, I have to select it previously with .setCurrentTab(i), what means that I'd be changing the active Tab...

I think this has to be a lot easier than I'm thinking about... Any help with this?

Thanks!

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

At that point I've realized that accessing an inactive tab's contents is not possible. At least not that way. Supposedly you cannot access an inactive tab's view because it has not an associated view, at least not a public one.

I've tried to declare a Map, where the first String is the tab's name, and the second is the TextView associated to its contents, and assign them in the moment of the tab creation. The result was that I was only able to reference the TextView of the active tab, the other ones threw a NullPointer exception.

So I focused the problem differently. Now if I have to add some text into an inactive tab, I add that text to a Hash, I declared an OnTabChangeListener and each time I change a tab I dump the pending content into it.

It's not the most brilliant solution, but it's the only one I got working... so if someone has a better solution to this I'll be grateful.

like image 260
nKn Avatar asked Nov 17 '13 12:11

nKn


People also ask

Which are the two Child of the TabHost?

TabHost consists of two children of which one is FrameLayout (which is used to show the contents of the activity) and another one is TabWidget.

Which are the two Child of the TabHost>?* 1 point?

This object holds two children: a set of tab labels that the user clicks to select a specific tab, and a FrameLayout object that displays the contents of that page.

How to use TabHost in android Studio?

This example demonstrates how to use tab host in android. Step 1 − Create a new project in Android Studio, go to File ⇒ New Project and fill all required details to create a new project. Step 2 − Add the following code to res/layout/activity_main. xml.


1 Answers

@nKn, thanks for getTabContentView(). In my case it returns not a tab, but a FrameLayout containing all tabs, and the following works:

View tab = tabHost.getTabContentView().getChildAt(2);
ImageView image = (ImageView) tab.findViewById(R.id.image);
like image 113
CoolMind Avatar answered Oct 23 '22 13:10

CoolMind