Replace Fragment with Another Fragment Inside Viewpager

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();
}
}

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.

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"

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.

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();


Related Topics



Leave a reply



Submit