How to replace View Pager completely with a new fragment in Android

I have the following xml file:

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="match_parent" /> 

I have three fragments in the pager view. In one of the fragments, I am trying to start a new fragment using this code:

 FragmentTransaction trans = getFragmentManager() .beginTransaction(); trans.replace(R.id.pager, new SubscriptionFragment()); trans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); trans.addToBackStack(null); trans.commit(); 

I can successfully replace the existing fragment of the ViewPager, but it does not serve my purpose, I want not to replace the existing fragment already present in the viewPager, but to remove the view player itself from the view and launch a new fragment, so that the top tabs are no longer visible, and ViewPager leaves the view. This works when I start a new action using intention. but does not work for the fragment.

Edited by:

 public class MainActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout, new MainFragment()).commit(); } } 

MainFragment:

 public class MainFragment extends Fragment { FragmentPagerAdapter adapterViewPager; ViewPager viewPager; String title[] = {"Services", "You", "History"}; // TODO: Rename and change types and number of parameters @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { /* Inflate the layout for this fragment */ View view = inflater.inflate(R.layout.fragment_view_pager, container, false); /*************************************/ //CALLING HISTORY API // loadSubscriptions(); return view; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); ViewPagerAdapter mAdapter = new ViewPagerAdapter(getFragmentManager()); ViewPager mPager = (ViewPager) getView().findViewById(R.id.pager); mPager.setAdapter(mAdapter); } public static class ViewPagerAdapter extends FragmentPagerAdapter { public ViewPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int num) { if (num == 0) { return new ServicesFragment(); } else { return new HistoryFragment(); } } @Override public int getCount() { return 2; } } } 

activity_main.xml

 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/frame_layout" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> </FrameLayout> 

fragment_view_pager.xml

 <?xml version="1.0" encoding="utf-8"?> <android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="match_parent" /> 

In servicefragment: I open a new fragment using:

 physiotherapyView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { FragmentTransaction trans = getFragmentManager() .beginTransaction(); /* * IMPORTANT: We use the "root frame" defined in * "root_fragment.xml" as the reference to replace fragment */ trans.replace(R.id.pager, new SubscriptionFragment()); /* * IMPORTANT: The following lines allow us to add the fragment * to the stack and return to it later, by pressing back */ trans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); trans.addToBackStack(null); trans.commit(); } }); 
+5
source share
2 answers

Below is the complete code for adding or removing snippets to or from the View pager. Since this is just a demonstration, I used only a text image, and each added fragment will have a random color. By clicking the button, you can add as many fragments as you want. By clicking on the page, you can simply remove it from the viewing panel. You can move from one page to another in the view pane using Swiping right or left.

MainActivity.java

 import android.graphics.Color; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentStatePagerAdapter; import android.support.v4.view.ViewPager; import android.view.View; import android.widget.Button; import java.util.ArrayList; import java.util.Random; public class MainActivity extends FragmentActivity { private MyPagerAdapter mpg; private ArrayList<MyFragment> fragmentlist = new ArrayList<>(); public FragmentManager fmr = getSupportFragmentManager(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final ViewPager pager = (ViewPager) findViewById(R.id.viewPager); mpg = new MyPagerAdapter(fmr,fragmentlist); pager.setAdapter(mpg); for (int q = 0; q < 5; q++) { int r = new Random().nextInt(100) + 155; int g = new Random().nextInt(100) + 155; int b = new Random().nextInt(100) + 155; fragmentlist.add(MyFragment.newInstance(q, "Page number: " + (q + 1), Color.rgb(r, g, b))); mpg.notifyDataSetChanged(); } Button B1 = (Button) findViewById(R.id.button); B1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int r = new Random().nextInt(100) + 155; int g = new Random().nextInt(100) + 155; int b = new Random().nextInt(100) + 155; int count = mpg.getCount(); fragmentlist.add(MyFragment.newInstance(count, "Page number: " + (count+1), Color.rgb(r, g, b))); mpg.notifyDataSetChanged(); } }); } public void delete(int pos) { int i = 0; while (i <= fragmentlist.size()) { if (pos == fragmentlist.get(i).getPosition()) break; i++; } fragmentlist.remove(i); mpg.notifyDataSetChanged(); } public class MyPagerAdapter extends FragmentStatePagerAdapter { private ArrayList<MyFragment> fragmentList; public MyPagerAdapter(FragmentManager fm, ArrayList<MyFragment> f) { super(fm); this.fragmentList = f; } @Override public Fragment getItem(int pos) { return fragmentlist.get(pos); } @Override public int getCount() { return fragmentlist.size(); } @Override public int getItemPosition(Object object) { return POSITION_NONE; } } } 

MyFragment.java

 import android.os.Bundle; import android.support.v4.app.Fragment; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.TextView; import java.util.List; public class MyFragment extends Fragment { int pos; @Override public View onCreateView(LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.f_1, container, false); pos = getArguments().getInt("num"); v.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.v("MainActivity", "Deleting at pos - " + pos); MainActivity activity = (MainActivity) getActivity(); activity.delete(pos); } }); TextView tv = (TextView) v.findViewById(R.id.tvFragFirst); FrameLayout fl = (FrameLayout) v.findViewById(R.id.frame_layout); tv.setText(getArguments().getString("msg")); fl.setBackgroundColor(getArguments().getInt("colour")); return v; } public int getPosition() { return pos; } public static MyFragment newInstance(int num,String text,int clr) { MyFragment f = new MyFragment(); Bundle b = new Bundle(); b.putString("msg", text); b.putInt("colour", clr); b.putInt("num",num); f.setArguments(b); return f; } } 

And xml.files,

activity_main.xml

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.shakthivels.assingment10.MainActivity" android:id="@+id/r_v" > <android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/viewPager" android:layout_width="fill_parent" android:layout_height="fill_parent"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="ADD a fragment" android:id="@+id/button" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" /> </RelativeLayout> 

f_1.xml

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/av" > <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:id="@+id/frame_layout"> <TextView android:id="@+id/tvFragFirst" android:layout_width="203dp" android:layout_height="127dp" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:textSize="26sp" android:text="TextView" android:layout_gravity="center" android:textColor="#000000" /> </FrameLayout> </RelativeLayout> 

Already Existing Fragment 1 Newly added Fragment to the view Pager 2

+1
source

Do not add ViewPager Inside FrameLayout.

 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/frame_layout" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> </FrameLayout> 

Add a snippet in this layout that contains the ViewPager and add a FragmentTransaction to your mainActivity

  public class MainActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout, new MainFragment()).commit(); 

Here MainFragment contains ViewPager.Now you can replace your viewPager with the whole layout using FragmentTransaction

0
source

All Articles