Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Replace one fragment to another fragment in the TabHost

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)));
    }
}
like image 560
It's me Avatar asked Jun 15 '13 09:06

It's me


People also ask

How do I replace one fragment with another?

Use replace() to replace an existing fragment in a container with an instance of a new fragment class that you provide. Calling replace() is equivalent to calling remove() with a fragment in a container and adding a new fragment to that same container. transaction. commit();

What is TabHost in Android?

TabHost is a container that holds a set of tabs. Each tab consists of either the activity or the fragments. 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. (It is used to choose the tab which the user wants to open).


1 Answers

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

Dynamically changing the fragments inside a fragment tab host?

like image 161
AndroidHacker Avatar answered Sep 30 '22 20:09

AndroidHacker