Replace one fragment to another fragment in the TabHost

It's me picture It's me · Jun 15, 2013 · Viewed 18.4k times · Source

I am creating a five tabs that contains one fragment each. I am using ListView in the first tab and in the ListView OnItemClickListener I want to replace from the first Tab Fragment to second tab Fragment. How can I do that by using Fragment and TabHost? I extends Fragment for main class and all fragment classes. I am not extends FragmentActivity. So how can I change the tab from one fragment to another fragment?

MainClass:

public class TabsFragment extends Fragment implements OnTabChangeListener {

    private View mRoot;
    public TabHost mTabHost;
    private int mCurrentTab;

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        mRoot = inflater.inflate(R.layout.tabs_fragment, null);
        mTabHost = (TabHost) mRoot.findViewById(android.R.id.tabhost);
        setupTabs();
        return mRoot;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        setRetainInstance(true);

        mTabHost.setOnTabChangedListener(this);
        mTabHost.setCurrentTab(mCurrentTab);
        // manually start loading stuff in the first tab
        updateTab("1");
    }

    private void setupTabs() {
        mTabHost.setup(); // important!
        mTabHost.addTab(newTab("1", R.drawable.fragment1, R.id.fragment1));
        mTabHost.addTab(newTab("2", R.drawable.fragment2, R.id.fragment2));
        mTabHost.addTab(newTab("3", R.drawable.fragment3, R.id.fragment3));
        mTabHost.addTab(newTab("4", R.drawable.fragment4, R.id.fragment4));
        mTabHost.addTab(newTab("5", R.drawable.fragment5, R.id.fragment5));
    }

    private TabSpec newTab(String tag, int labelId, int tabContentId) {
        Log.d(TAG, "buildTab(): tag=" + tag);

        View indicator = LayoutInflater.from(getActivity()).inflate(
                R.layout.tab,
                (ViewGroup) mRoot.findViewById(android.R.id.tabs), false);
        ((ImageView) indicator.findViewById(R.id.imageView1)).setImageResource(labelId);
        TabSpec tabSpec = mTabHost.newTabSpec(tag);
        tabSpec.setIndicator(indicator);
        tabSpec.setContent(tabContentId);
        return tabSpec;
    }

    @Override
    public void onTabChanged(String tabId) {
        updateTab(tabId);
        mCurrentTab = Integer.valueOf(tabId) - 1;
    }

    private void updateTab(String tabId) {
        FragmentManager fm = getFragmentManager();

        if (fm.findFragmentByTag(tabId) == null) {
            if (tabId.equals("1"))
                 fm.beginTransaction().replace(R.id.fragment1, new Fragment1(), tabId).commit();
            else if (tabId.equals("2"))
                fm.beginTransaction().replace(R.id.fragment2, new Fragment2(), tabId).commit();
            else if (tabId.equals("3"))
                fm.beginTransaction().replace(R.id.fragment3, new Fragment3(), tabId).commit();
            else if (tabId.equals("4"))
                fm.beginTransaction().replace(R.id.fragment4, new Fragment4(), tabId).commit();
            else if (tabId.equals("5"))
                fm.beginTransaction().replace(R.id.fragment5, new Fragment5(), tabId).commit();
        }
    }
}

Fragment1:

public class Fragment1 extends Fragment implements  OnItemClickListener {
    ListView listView;
    View theView;

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        theView = inflater.inflate(R.layout.fragment1, container, false);
        listView = (ListView)theView.findViewById(R.id.list);
        listView.setOnItemClickListener(this);
        return theView;

    }

    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

        // Here I want to switch from 1st Tab(Fragment1) to 2nd Tab(Fragment2)
        // How can I switch from 1st tab to 2nd tab here???
        // Below code is not worked for me.

        Fragment2 newFragment = new Fragment2();
        FragmentTransaction transaction = getFragmentManager().beginTransaction();
        transaction.replace(R.id.map, newFragment);
        transaction.commit();
    }
}

Fragment2:

public class Fragment2 extends SupportMapFragment {
    private LatLng mPosFija = new LatLng(37.878901,-4.779396);
    GoogleMap mapView;
    public Fragment2() {
        super();
    }

    public static Fragment2 newInstance(LatLng posicion) {
        Fragment2 frag = new Fragment2();
        frag.mPosFija = posicion;
        return frag;
    }
    @Override
    public void onResume() {
      super.onResume();
      initMap();
    }

    @Override
    public void onCreate(Bundle arg0) {
        super.onCreate(arg0);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = super.onCreateView(inflater, container, savedInstanceState);
        view = inflater.inflate(R.layout.fragment2, container, false);
        view.setId(getId());
        SupportMapFragment fm = (SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.mapview);
        mapView = fm.getMap();
        initMap();
        return view;
    }

    private void initMap() {
        UiSettings settings = mapView.getUiSettings();
        settings.setAllGesturesEnabled(true);
        settings.setMyLocationButtonEnabled(true);
        mapView.addMarker(new MarkerOptions().position(mPosFija).icon(BitmapDescriptorFactory.fromResource(R.drawable.icon)));
    }
}

Answer

AndroidHacker picture AndroidHacker · Nov 19, 2013

Check out my post. This contains all you need with basic.

Dynamically changing the fragments inside a fragment tab host?