How to replace fragment from ViewPager with a new one
The container you are using is wrong.Maintain one container in the activity xml and use that container to load all the fragments.
transaction.replace(R.id.container, fragment);
The container here is to be the activity container in which viewpager and other views should be present.
Replace one Fragment with another in ViewPager
After so many hours spent, I've found correct solution modifying code in that answer.
It replaces Fragment
in first page of ViewPager
with another one, and if you return back from second Fragment
, first Fragment
is correctly displayed. Doesn't matter Fragment
displayed in first page, if you swipe from one page to another, it doesn't change its Fragment
.
Here is my code:
FragmentActivity
public class TabsFacturasActivity extends SherlockFragmentActivity {
public void onBackPressed() {
if(mPager.getCurrentItem() == 0) {
if (mAdapter.getItem(0) instanceof DetallesFacturaFragment) {
((DetallesFacturaFragment) mAdapter.getItem(0)).backPressed();
}
else if (mAdapter.getItem(0) instanceof FacturasFragment) {
finish();
}
}
}
private static class MyAdapter extends FragmentPagerAdapter {
private final class FirstPageListener implements
FirstPageFragmentListener {
public void onSwitchToNextFragment() {
mFragmentManager.beginTransaction().remove(mFragmentAtPos0)
.commit();
if (mFragmentAtPos0 instanceof FacturasFragment){
mFragmentAtPos0 = new DetallesFacturaFragment(listener);
}else{ // Instance of NextFragment
mFragmentAtPos0 = new FacturasFragment(listener);
}
notifyDataSetChanged();
}
}
private String[] titles = { "VER FACTURAS", "VER CONSUMO", "INTRODUCIR LECTURA" };
private final FragmentManager mFragmentManager;
public Fragment mFragmentAtPos0;
private Context context;
FirstPageListener listener = new FirstPageListener();
public MyAdapter(FragmentManager fragmentManager) {
super(fragmentManager);
mFragmentManager = fragmentManager;
}
@Override
public CharSequence getPageTitle(int position) {
return titles[position];
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0: // Fragment # 0
if (mFragmentAtPos0 == null)
{
mFragmentAtPos0 = new FacturasFragment(listener);
}
return mFragmentAtPos0;
case 1: // Fragment # 1
return new ConsumoFragment();
case 2:// Fragment # 2
return new LecturaFragment();
}
return null;
}
@Override
public int getCount() {
return titles.length;
}
@Override
public int getItemPosition(Object object)
{
if (object instanceof FacturasFragment &&
mFragmentAtPos0 instanceof DetallesFacturaFragment) {
return POSITION_NONE;
}
if (object instanceof DetallesFacturaFragment &&
mFragmentAtPos0 instanceof FacturasFragment) {
return POSITION_NONE;
}
return POSITION_UNCHANGED;
}
}
}
FirstPageFragmentListener
public interface FirstPageFragmentListener {
void onSwitchToNextFragment();
}
FacturasFragment (FirstFragment)
public class FacturasFragment extends ListFragment implements FirstPageFragmentListener {
static FirstPageFragmentListener firstPageListener;
public FacturasFragment() {
}
public FacturasFragment(FirstPageFragmentListener listener) {
firstPageListener = listener;
}
public void onListItemClick (ListView l, View v, int position, long id) {
firstPageListener.onSwitchToNextFragment();
}
}
DetallesFacturaFragment (SecondFragment)
public class DetallesFacturaFragment extends SherlockFragment {
static FirstPageFragmentListener firstPageListener;
public DetallesFacturaFragment() {
}
public DetallesFacturaFragment(FirstPageFragmentListener listener) {
firstPageListener = listener;
}
public void backPressed() {
firstPageListener.onSwitchToNextFragment();
}
}
Replace Fragment with another in ViewPager
You can add to your fragment layout a frameLayout and replace
FragmentManager fragMgr = getFragmentManager();
FragmentTransaction ft = fragMgr.beginTransaction();
ft.addToBackStack(null);
ft.replace(R.id.view_pager, new sub_category(), TAG);
ft.commit();
with:
getChildFragmentManager().beginTransaction().add(*frameLayout ID* , new sub_category(), tag).commit();
Replace fragment with another fragment inside ViewPager
Try using FragmentStatePagerAdapter
http://android-developers.blogspot.com/2011_08_01_archive.html
coz it will remove the fragment as you swipe through the view(also when you call getitem), so you don't need to explicitly remove them yourself.
I've been having the same problem it works for me.
I try your code and remove the if (fragment!=null)
block and it works.
How to open another fragment from inside a ViewPager fragment?
The problem is now gone. I just need to make few changes to my codes. Inside onClickListener, I changed my codes like this-
Before:
FragmentManager fragmentManager = getChildFragmentManager();
After:
FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
And inside the fragment_four.xml file's relative layout:
android:background="@color/bgcolor"
android:clickable="true"
android:focusable="true"
Related Topics
"Conversion to Dalvik Format Failed With Error 1" on External Jar
Android: Alternate Layout Xml For Landscape Mode
Is the Way the Firebase Database Quickstart Handles Counts Secure
Android Java.Exe Finished With Non-Zero Exit Value 1
Android - Android.Os.Networkonmainthreadexception
How to Create an Object of an Activity in Other Class
How to Dynamically Add Elements to a Listview on Android
Dilemma: When to Use Fragments VS Activities:
How to Get the Build/Version Number of Your Android Application
How to Add the New "Floating Action Button" Between Two Widgets/Layouts
How to Prevent Custom Views from Losing State Across Screen Orientation Changes
How to Set a Custom Font in the Actionbar Title
Height of Status Bar in Android
How to Connect to Android With Adb Over Tcp