Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Adding Tab inside Fragment In Android?

I am trying to add a TabHost inside a Fragment. The code is given below. Here inside the Fragment. I am trying to add TabHost to show two Tabs:

package com.nordicsoft.dilosysNewVersion;  import android.app.Fragment; import android.content.Intent; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TabHost;  public class Fragment_Coupons extends Fragment {     TabHost tabHost;     TabHost.TabSpec spec;      public Fragment_Coupons() {     }      @Override     public View onCreateView(LayoutInflater inflater, ViewGroup container,             Bundle savedInstanceState) {          View rootView = inflater.inflate(R.layout.fragment_coupon, container,                 false);         tabHost = (TabHost) rootView.findViewById(android.R.id.tabhost);         tabHost.setup();         //Add_Text_To_Tab("Android", "IOS");          Intent intentAndroid = new Intent().setClass(getActivity(),                 Aclass.class);         spec = tabHost.newTabSpec("Android").setContent(intentAndroid)                 .setIndicator("Android");          tabHost.addTab(spec);          Intent intentBus = new Intent().setClass(getActivity(), Bclass.class);         spec = tabHost.newTabSpec("Welcome").setIndicator("Welcome")                 .setContent(intentBus).setIndicator("Welcome");         tabHost.addTab(spec);         return rootView;     }  } 

The XML code:

<?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"/>     </LinearLayout> </TabHost> 

This Is giving me the error:

12-09 17:40:53.509: E/AndroidRuntime(18103): FATAL EXCEPTION: main 12-09 17:40:53.509: E/AndroidRuntime(18103): java.lang.IllegalStateException: Did you forget to call 'public void setup(LocalActivityManager activityGroup)'? 12-09 17:40:53.509: E/AndroidRuntime(18103):    at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:690) 12-09 17:40:53.509: E/AndroidRuntime(18103):    at android.widget.TabHost.setCurrentTab(TabHost.java:356) 12-09 17:40:53.509: E/AndroidRuntime(18103):    at android.widget.TabHost.addTab(TabHost.java:246) 12-09 17:40:53.509: E/AndroidRuntime(18103):    at com.nordicsoft.dilosysNewVersion.Fragment_Coupons.onCreateView(Fragment_Coupons.java:32) 12-09 17:40:53.509: E/AndroidRuntime(18103):    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:828) 12-09 17:40:53.509: E/AndroidRuntime(18103):    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1032) 12-09 17:40:53.509: E/AndroidRuntime(18103):    at android.app.BackStackRecord.run(BackStackRecord.java:622) 12-09 17:40:53.509: E/AndroidRuntime(18103):    at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1382) 12-09 17:40:53.509: E/AndroidRuntime(18103):    at android.app.FragmentManagerImpl$1.run(FragmentManager.java:426) 12-09 17:40:53.509: E/AndroidRuntime(18103):    at android.os.Handler.handleCallback(Handler.java:605) 12-09 17:40:53.509: E/AndroidRuntime(18103):    at android.os.Handler.dispatchMessage(Handler.java:92) 12-09 17:40:53.509: E/AndroidRuntime(18103):    at android.os.Looper.loop(Looper.java:137) 12-09 17:40:53.509: E/AndroidRuntime(18103):    at android.app.ActivityThread.main(ActivityThread.java:4517) 12-09 17:40:53.509: E/AndroidRuntime(18103):    at java.lang.reflect.Method.invokeNative(Native Method) 12-09 17:40:53.509: E/AndroidRuntime(18103):    at java.lang.reflect.Method.invoke(Method.java:511) 12-09 17:40:53.509: E/AndroidRuntime(18103):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993) 12-09 17:40:53.509: E/AndroidRuntime(18103):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760) 12-09 17:40:53.509: E/AndroidRuntime(18103):    at dalvik.system.NativeStart.main(Native Method) 12-09 17:46:02.770: I/Process(18103): Sending signal. PID: 18103 SIG: 9 
like image 611
NRahman Avatar asked Dec 09 '13 11:12

NRahman


2 Answers

Try to do this to handle the Tabs:

public class MainFragment extends Fragment {     private FragmentTabHost mTabHost;      //Mandatory Constructor     public MainFragment() {     }      public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);      }      public View onCreateView(LayoutInflater inflater, ViewGroup container,             Bundle savedInstanceState) {          View rootView = inflater.inflate(R.layout.fragment_tabs,container, false);           mTabHost = (FragmentTabHost)rootView.findViewById(android.R.id.tabhost);         mTabHost.setup(getActivity(), getChildFragmentManager(), R.id.realtabcontent);          mTabHost.addTab(mTabHost.newTabSpec("fragmentb").setIndicator("Fragment B"),                 FragmentB.class, null);         mTabHost.addTab(mTabHost.newTabSpec("fragmentc").setIndicator("Fragment C"),                 FragmentC.class, null);         mTabHost.addTab(mTabHost.newTabSpec("fragmentd").setIndicator("Fragment D"),                 FragmentD.class, null);           return rootView;     } } 

With the layout:

<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:orientation="vertical"         android:layout_width="match_parent"         android:layout_height="match_parent">          <FrameLayout             android:id="@+id/realtabcontent"             android:layout_width="match_parent"             android:layout_height="0dp"             android:layout_weight="1"/>      </LinearLayout> </android.support.v4.app.FragmentTabHost> 

The MotherActivity to host the MainFragment:

public class MotherActivity extends FragmentActivity {  @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);          MainFragment fragmenttab = new MainFragment();         getSupportFragmentManager().beginTransaction()         .add(R.id.item_detail_container, fragmenttab).commit();       } 

And MotherActivity layout:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools"     android:id="@+id/item_detail_container"     android:layout_width="match_parent"     android:layout_height="match_parent"  /> 

After this just create the normal fragment B and C, etc Class. The Result will be:

Tab Fragment inside Fragment Result

like image 191
ElCharro Avatar answered Sep 28 '22 02:09

ElCharro


Try adding this line

tabHost.setup(this.getActivity().getLocalActivityManager()); 

before the line

tabHost.addTab(spec); 

or try adding:

LocalActivityManager mLocalActivityManager = new LocalActivityManager(this.getActivity(), false); mLocalActivityManager.dispatchCreate(savedInstanceState); host.setup(mLocalActivityManager); 
like image 34
SalGad Avatar answered Sep 28 '22 00:09

SalGad