How do I use tabHost for Android - java

I have looked at posts on Stack Overflow and at tutorials on other websites, and I cannot understand how to use TabHost. Can someone please explain it to me and maybe send me a link to a tutorial?

In ManiActivity extends TabActivity
public class MainActivity extends TabActivity {
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
TabHost mTabHost = getTabHost();
mTabHost.addTab(mTabHost.newTabSpec("first").setIndicator("First").setContent(new Intent(this ,FirstActivity.class )));
mTabHost.addTab(mTabHost.newTabSpec("second").setIndicator("Second").setContent(new Intent(this , SecondActivity.class )));
mTabHost.setCurrentTab(0);
}
}
In this activity not use layout "activity_main.xml" .
Tabhost mTabHost = getTabHost(); is create main tab.
mTabHost.newTabSpec("first") is create tabspec id "first".
setIndicator("First") is create text "First" in title tab.
setContent(new Intent(this ,FirstActivity.class )) is use content from FirstActivity.class ( FirstActivity.java )
mTabHost.addTab(....) is add spectab to main tab
mTabHost.setCurrentTab(0) is defult tab when start page.
FirstActivity.java
public class FirstActivity extends Activity{
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView( R.layout.first_layout );
}
}
SecondActivity.java
public class SecondActivity extends Activity{
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView( R.layout.second_layout );
}
}
"R.layout.first_layout" is content from first_layout.xml
"R.layout.second_layout" is content from second_layout.xml
In AndroidManifest.xml add activity name ".FirstActivity" and ".SecondActivity" in example xml.
Finish!!!!!

First of all while TabHost is not deprecated, TabActivity on other hand is deprecated due to Fragment API.
There are two ways to use TabHost; using Fragment via FragmentTabHost and using TabHost.TabContentFactory.
1. Using Fragment via FragmentTabHost
This sample code show you how to use TabHost in Activity.
FragmentTabHostActivity.java
public class FragmentTabHostActivity extends AppCompatActivity {
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_tab_host_activity);
FragmentTabHost fragmentTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);
fragmentTabHost.setup(this, getSupportFragmentManager(), android.R.id.tabcontent);
fragmentTabHost.addTab(getTabSpec1(fragmentTabHost), Tab1Fragment.class, null);
fragmentTabHost.addTab(getTabSpec2(fragmentTabHost), Tab2Fragment.class, null);
}
private TabHost.TabSpec getTabSpec1(FragmentTabHost tabHost) {
return tabHost.newTabSpec("First Tab")
.setIndicator("Tab1");
}
private TabHost.TabSpec getTabSpec2(FragmentTabHost tabHost) {
return tabHost.newTabSpec("Second Tab")
.setIndicator("Tab 2");
}
}
fragment_tab_host_activity.xml
<android.support.v4.app.FragmentTabHost
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="#android:id/tabhost"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
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"/>
<FrameLayout
android:id="#android:id/tabcontent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
</android.support.v4.app.FragmentTabHost>
Actually by using Fragment, you can use Tab inside a Fragment (Android docs).
2. Using TabHost.ContentFactory
TabHostActivity.java
public class TabHostActivity extends AppCompatActivity implements TabHost.TabContentFactory {
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TabHost tabHost = (TabHost) findViewById(android.R.id.tabhost);
tabHost.setup();
tabHost.addTab(getTabSpec1(tabHost));
tabHost.addTab(getTabSpec2(tabHost));
}
private TabHost.TabSpec getTabSpec1(TabHost tabHost) {
return tabHost.newTabSpec("First Tab")
.setIndicator("Tab1")
.setContent(this);
}
private TabHost.TabSpec getTabSpec2(TabHost tabHost) {
return tabHost.newTabSpec("Second Tab")
.setIndicator("Tab 2")
.setContent(this);
}
#Override
public View createTabContent(String tag) {
return LayoutInflater.from(this).inflate(R.layout.activity_tab_1, null);
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<TabHost
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="#android:id/tabhost"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
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"/>
<FrameLayout
android:id="#android:id/tabcontent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
</TabHost>
However, I personally recommend using newest Material Design style TabLayout class.

Related

How can I implement a java method in to return the activity to the mainActivity?

I have my code for a simple activity to return to the main activity once the user clicks on the home button.
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_greetings);
// Set up onclicklistener for homeIcon imageview to go to back one activity
ImageView homeIcon = (ImageView) findViewById(R.id.home_icon);
homeIcon.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
finish();
}
});
}
This is a java file for a single activity, greetings. I want this home button + functionality for many other activities, but I do not want to copy and paste. Should I make another java class, and implement the function inside of it? I tried, but it can not findviewbyid.
Without your code really hard understand why you can not find by id, but I can offer this way:
HomeButtonActivity.java
public class HomeButtonActivity extends AppCompatActivity
{
#Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Button home_button = (Button) findViewById(R.id.home_button);
home_button.setOnClickListener(new View.OnClickListener()
{
#Override
public void onClick(View view)
{
Toast.makeText(HomeButtonActivity.this, "Replace with your own action", Toast.LENGTH_SHORT).show();
}
});
}
}
Activity1.java
public class Activity1 extends HomeButtonActivity
{
#Override
protected void onCreate(Bundle savedInstanceState)
{
setContentView(R.layout.activity1);
super.onCreate(savedInstanceState);
}
}
activity1.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.myapplication.HomeButtonActivity">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="#style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android:id="#+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="#style/AppTheme.PopupOverlay" />
</android.support.design.widget.AppBarLayout>
<include layout="#layout/content_main" />
<include layout="#layout/home_button" />
</android.support.design.widget.CoordinatorLayout>
home_button.xml
<?xml version="1.0" encoding="utf-8"?>
<Button xmlns:android="http://schemas.android.com/apk/res/android"
android:id="#+id/home_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|center"
android:text="home button"/>
create class e.g ReturnClass and create constructor for it, then pass Context as parameter e.g ReturnClass(Context context) then write
Intent intent = new Intent(context , MainActivity.class);
context.startActivity(intent);
from each activity you can call this class and pass activity to it , and ReturnClass return it to main activity

Android tabhost error null pointer tabwidget

Mainactivity:
public class MainActivity extends AppCompatActivity {
TabHost mTabHost;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTabHost = (TabHost) findViewById(android.R.id.tabhost);
setupTab(new TextView(this), "Tab 1");
setupTab(new TextView(this), "Tab 2");
setupTab(new TextView(this), "Tab 3");
}
private void setupTab(final View view, final String tag) {
View tabview = createTabView(mTabHost.getContext(), tag);
TabHost.TabSpec setContent = mTabHost.newTabSpec(tag).setIndicator(tabview).setContent(new TabHost.TabContentFactory() {
public View createTabContent(String tag) {return view;}
});
mTabHost.addTab(setContent);
}
private static View createTabView(final Context context, final String text) {
View view = LayoutInflater.from(context).inflate(R.layout.tabs_bg, null);
TextView tv = (TextView) view.findViewById(R.id.tabsText);
tv.setText(text);
return view;
}
}
Activity_main
<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="#android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TabWidget android:id="#android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<FrameLayout android:id="#android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
</FrameLayout>
</LinearLayout>
</TabHost>
I am experimenting with tabs in order to make a bottom navigation bar without material design library.
How to fix this error? (Attempt to invoke virtual method 'void android.widget.TabWidget.setStripEnabled(boolean)' on a null object reference)
You need invoke mTabHost.setup(...);
The reason is your activity does not extends TabActivity, you should invoke TabHost.setup(...) before TabHost.addTab(...) method.

Problems with setting up tabs using Tabhost in Android?

So, i was following the NewBoston series on Android tutorials. So, there is this tutorial on setting up tabs using Tabhost and Tabspecs. Now, i tried exactly what the tutorial does but crashes and it points to a particular line in my code which is setContentView() method in the OnCreate(). I tried even removing it and ran the code but the program just crashes. What could be my mistake? I also tried the code in the following article to see if that works but it still crashes.
http://www.learn-android-easily.com/2013/07/android-tabwidget-example.html
This is my code-
Splash.java is the class that starts up the Launcher activity
public class Splash extends TabActivity {
TabHost th;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.splash);
th = (TabHost)findViewById(R.id.tabHost2);
TabHost.TabSpec tab1 = th.newTabSpec("First Tab");
TabHost.TabSpec tab2 = th.newTabSpec("Second Tab");
TabHost.TabSpec tab3 = th.newTabSpec("Third tab");
tab1.setIndicator("Tab1");
tab1.setContent(new Intent(this,TabActivity1.class));
tab2.setIndicator("Tab2");
tab2.setContent(new Intent(this, TabActivity2.class));
tab3.setIndicator("Tab3");
tab3.setContent(new Intent(this, TabActivity3.class));
th.addTab(tab1);
th.addTab(tab2);
th.addTab(tab3);
}
}
TabActivity1.java-
public class TabActivity1 extends Activity {
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv=new TextView(this);
tv.setTextSize(25);
tv.setGravity(Gravity.CENTER_VERTICAL);
tv.setText("This Is Tab1 Activity");
setContentView(tv);
}
}
TabActivity2.java:-
public class TabActivity2 extends Activity {
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv=new TextView(this);
tv.setTextSize(25);
tv.setGravity(Gravity.CENTER_VERTICAL);
tv.setText("This Is Tab2 Activity");
setContentView(tv);
}
}
TabActivity3.java
public class TabActivity3 extends Activity {
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv=new TextView(this);
tv.setTextSize(25);
tv.setGravity(Gravity.CENTER_VERTICAL);
tv.setText("This Is Tab3 Activity");
setContentView(tv);
}
}
splash.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TabHost
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="#+id/tabHost2"
android:layout_gravity="center_horizontal">
<LinearLayout
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">
<LinearLayout
android:id="#+id/linearLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"></LinearLayout>
<LinearLayout
android:id="#+id/linearLayout2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"></LinearLayout>
<LinearLayout
android:id="#+id/linearLayout3"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"></LinearLayout>
</FrameLayout>
</LinearLayout>
</TabHost>
</LinearLayout>
Change this line
th = (TabHost)findViewById(R.id.tabHost2);
to
th = (TabHost)findViewById(android.R.id.tabHost2);
This will do.
Because, in the layout file, you might have set Tabhost id like this android:id="#android:id/tabhost2">

Need to to fix android tabs

I am making tabs in android. Currently this is how my tabs are working. When I click on any tab it will take me to appropriate tab's view which is fine. But lets say when I click on Profile tab then inside this profile view there is a button Add New. When I click on Add New button then it takes me to it's view but it also removes tabs from the view which I don't want. So how can I make tabs always available even when user clicks any link or button inside any view?
Here is my current code
tabs.xml
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="#android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<RelativeLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="5dp">
<TabWidget
android:id="#android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true" />
<FrameLayout
android:id="#android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="5dp" />
</RelativeLayout>
</TabHost>
Tabs.java
public class Tabs extends TabActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tabs);
Resources resources = getResources();
TabHost tabHost = getTabHost();
Intent startUseSaldo = new Intent().setClass(this, Usesaldo.class);
TabSpec useSaldo = tabHost
.newTabSpec("UseSaldo")
.setIndicator("Use Saldo")
.setContent(startUseSaldo);
Intent startHistory = new Intent().setClass(this, History.class);
TabSpec history = tabHost
.newTabSpec("History")
.setIndicator("History")
.setContent(startHistory);
Intent startProfile = new Intent().setClass(this, Profile.class);
TabSpec profile = tabHost
.newTabSpec("Profile")
.setIndicator("Profile")
.setContent(startProfile);
// add all tabs
tabHost.addTab(useSaldo);
tabHost.addTab(history);
tabHost.addTab(profile);
tabHost.setCurrentTab(1);
}
}
Profile.java
public class Profile extends Activity {
Button bAddNew;
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.profile);
bAddNew = (Button)findViewById(R.id.bAddNew);
bAddNew.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
Intent AddFacility = new Intent(getApplicationContext(), AddFacility.class);
startActivity(AddFacility);
}
});
}
}
AddFacility.java
public class AddFacility extends Activity {
#Override
public void setContentView(int layoutResID) {
// TODO Auto-generated method stub
super.setContentView(R.layout.add_facility);
}
}
Try this example - http://gamma-point.com/content/android-how-have-multiple-activities-under-single-tab-tabactivity
You have to use ActivityGroup with Tabhost
http://richipal.com/post/2624844577
But as ActivityGroups are depericated you should use Fragments with Tabhost

Multiple Tab activities in one application

As an example, see the following tutorial on how my tabs are setup initially.
Instead of a normal activity running on one of the tabs, I want another TabActivity. So what I'm trying to do is run a TabActivity within a TabActivity. I believe the issue is that the ID's conflict. I have tried to solve this by changing the ID's on the secondary activity's xml file and calling those manually in the activity, but have had no luck.
I have been searching for hours for a solution for this, but have come up with nothing.
Multiple tab activities with an application is possible.
For instance:
App contains a Launcher TabActivity (HomeTabActivity) with two tabs : Tab 1 and Tab 2
Tab 1 can be a TabActivity with two or more tabs.
Tab 2 can be a TabActivity with two or more tabs.
FirstTab, SecondTab, ThirdTab and FourthTab are simple activities actings as child for child of HomeTabActivity.
xml files containing TabHost as parent element
1. hometab.xml
2. tab1.xml
3. tab2.xml
To differentiate between HomeTabActivity and Its child TabActivities i.e Tab1 and Tab2
I have put TabWidget at top for HomeTabActivity and at bottom for Tab1 and Tab2.
HomeTabActivity (Very First Main Tab Activity):
public class HomeTabActivity extends TabActivity
{
private TabHost mTabHost = null;
private Intent mIntent = null;
private TabHost.TabSpec mTabSpec = null;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.hometab);
initializeTabs();
}
private void initializeTabs() {
mTabHost = getTabHost();
mIntent = new Intent().setClass(this, Tab1.class);
mTabSpec = mTabHost
.newTabSpec("Tab1")
.setIndicator("Tab1",
getResources().getDrawable(R.drawable.ic_launcher))
.setContent(mIntent);
mTabHost.addTab(mTabSpec);
mIntent = new Intent().setClass(this, Tab2.class);
mTabSpec = mTabHost
.newTabSpec("Tab2")
.setIndicator("Tab2",
getResources().getDrawable(R.drawable.ic_launcher))
.setContent(mIntent);
mTabHost.addTab(mTabSpec);
mTabHost.setCurrentTab(0);
}
}
Tab1 (TabActivity Embedded inside the HomeTabActivity) :
public class Tab1 extends TabActivity
{
private TabHost mTabHost = null;
private Intent mIntent = null;
private TabHost.TabSpec mTabSpec = null;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tab1);
initializeTabs();
}
private void initializeTabs() {
mTabHost = getTabHost();
mIntent = new Intent().setClass(this, FirstTab.class);
mTabSpec = mTabHost
.newTabSpec("Tab1 Child 1")
.setIndicator("Tab1 Child 1",
getResources().getDrawable(R.drawable.ic_launcher))
.setContent(mIntent);
mTabHost.addTab(mTabSpec);
mIntent = new Intent().setClass(this, SecondTab.class);
mTabSpec = mTabHost
.newTabSpec("Tab1 Child 2")
.setIndicator("Tab1 Child 2",
getResources().getDrawable(R.drawable.ic_launcher))
.setContent(mIntent);
mTabHost.addTab(mTabSpec);
mTabHost.setCurrentTab(0);
}
}
Tab2 (Another TabActivity Embedded inside the HomeTabActivity) :
public class Tab2 extends TabActivity
{
private TabHost mTabHost = null;
private Intent mIntent = null;
private TabHost.TabSpec mTabSpec = null;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tab2);
initializeTabs();
}
private void initializeTabs() {
mTabHost = getTabHost();
mIntent = new Intent().setClass(this, ThirdTab.class);
mTabSpec = mTabHost
.newTabSpec("Tab2 Child 1")
.setIndicator("Tab2 Child 1",
getResources().getDrawable(R.drawable.ic_launcher))
.setContent(mIntent);
mTabHost.addTab(mTabSpec);
mIntent = new Intent().setClass(this, FourthTab.class);
mTabSpec = mTabHost
.newTabSpec("Tab2 Child 2")
.setIndicator("Tab2 Child 2",
getResources().getDrawable(R.drawable.ic_launcher))
.setContent(mIntent);
mTabHost.addTab(mTabSpec);
mTabHost.setCurrentTab(1);
}
}
hometab.xml
<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="#android:id/tabhost"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
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" >
</FrameLayout>
</LinearLayout>
</TabHost>
tab1.xml and tab2.xml
<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="#android:id/tabhost"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<FrameLayout
android:id="#android:id/tabcontent"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#color/androidblue"
android:layout_weight="1">
</FrameLayout>
<TabWidget
android:id="#android:id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0">
</TabWidget>
</LinearLayout>
</TabHost>

Categories

Resources