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)));
}
}
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();
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).
Check out my post. This contains all you need with basic.
Dynamically changing the fragments inside a fragment tab host?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With