Android: TabHost without TabActivity

I want to create tabs without extending TabActivity. (The reason is that TabActivity cannot handle a custom titlebar as it seems). I have

public class startTab extends Activity {

 @Override
 public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mylayout);
        Resources res = getResources();
        LocalActivityManager mlam = new LocalActivityManager(this, false);
        TabHost tabHost = (TabHost) findViewById(R.id.tabhost);
        tabHost.setup(mlam);
        TabHost.TabSpec spec;
        Intent intent;

    intent = new Intent().setClass(this, Show1.class);
    spec = tabHost.newTabSpec("Items").setIndicator("Items", res.getDrawable(R.drawable.items32_ldpi)).setContent(intent);
    tabHost.addTab(spec);

    intent = new Intent().setClass(this, Show2.class);
    spec = tabHost.newTabSpec("Users").setIndicator("Users",res.getDrawable(R.drawable.user32_ldpi)).setContent(intent);
    tabHost.addTab(spec);
}

}

  • Android: How do A/B testing platforms modify assets on the fly?
  • Can I cancel previous Toast when i want to show an other Toast?
  • How to expand AppBarLayout when scrolling down reaches at top of the RecyclerView
  • How to make recycler view start adding items from center?
  • How to animate FloatingActionButton of new Design Support Library
  • How to retrieve path to ADB in build.gradle
  • The error I get is

        07-02 07:11:12.715: ERROR/AndroidRuntime(411): 
    Caused by: java.lang.IllegalStateException: Activities can't be added until the containing group has been created.
    

    The xml for the view is

    <?xml version="1.0" encoding="utf-8"?>
    <TabHost xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/tabhost" android:orientation="vertical" android:layout_width="fill_parent"
     android:layout_height="fill_parent" >
     <LinearLayout android:orientation="vertical"
      android:layout_width="fill_parent" android:layout_height="fill_parent"
      android:paddingTop="5dip">
      <TabWidget android:id="@android:id/tabs"
       android:layout_width="fill_parent" android:layout_height="fill_parent"></TabWidget>
      <FrameLayout android:id="@android:id/tabcontent"
       android:layout_width="fill_parent" android:layout_height="fill_parent"
       android:paddingTop="5dip">
      </FrameLayout>
     </LinearLayout>
    </TabHost>
    

    I read somewhere that I have to use a LocalActivityManager, I assume that I am missing something there. Anyone an idea?

    Thanks!

  • How to create Android Facebook Key Hash?
  • Sending email from android app
  • android how to work with asynctasks progressdialog
  • Android programmatically disable autocomplete/autosuggest for EditText in emulator
  • Authorative way to override onMeasure()?
  • How to keep a single activity instance but be able to update the view?
  • 4 Solutions collect form web for “Android: TabHost without TabActivity”

    Before calling tabHost.setup(mLocalActivityManager); you need to add this line.

    mlam.dispatchCreate(savedInstanceState);
    tabHost.setup(mlam );
    

    similarly, you need to add for onResume,

    mlam.dispatchResume(); 
    

    onPause(),

     mlam.dispatchPause(isFinishing());
    

    Please consider using Views as the contents of your tabs. Not only will this result in less code, less consumed heap space, less consumed stack space, and lower CPU utilization, it will also get you past this problem. Here are two examples showing this technique.

    public class ScoreboardActivity extends Activity {
        LocalActivityManager mlam;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_scoreboard);
            mlam = new LocalActivityManager(this, false);
            mlam.dispatchCreate(savedInstanceState);
            TabHost th = (TabHost) findViewById(android.R.id.tabhost);
            th.setup(mlam);
            th.addTab(th.newTabSpec("Numpad").setIndicator("Numpad").setContent(R.id.tab1));
            th.addTab(th.newTabSpec("CardCount").setIndicator("CardCount").setContent(R.id.tab2));
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.activity_scoreboard, menu);
            return true;
    
    
        }
        @Override
        protected void onResume(){
            super.onResume();
            mlam.dispatchResume();
        }
    
        @Override
        protected void onPause(){
            super.onPause();
            mlam.dispatchPause(isFinishing());
        }
    
    }
    

    Design considerations notwithstanding, the following does not work at all, and the API seems to indicate that setContent(Intent i) is valid. This works when the activity extends TabActivity, however, extending Activity and adding setup() call results in an exception at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:649)

    Funny thing is, the LogCat suggests I forgot to call setup()

    mTabHost = (TabHost) findViewById(android.R.id.tabhost);
    mTabHost.setup();
    
    Intent tab1Intent = new Intent(this, ActivityOne.class);
    Button tab1View = new Button(this);
    tab1View.setText("Activity 1");
      mTabHost.addTab(mTabHost.newTabSpec("tab_1").setIndicator(tab1View).setContent(tab1Intent));
    
    Android Babe is a Google Android Fan, All about Android Phones, Android Wear, Android Dev and Android Games Apps and so on.