How can I add a fragment to a ViewPager? addView crashes my app
you can follow this approach:
just Use fragments for each view in a pager.
write the below code in onCreate()
method of the FragmentActivity
.
List<Fragment> fragments = new Vector<Fragment>();
//for each fragment you want to add to the pager
Bundle page = new Bundle();
page.putString("url", url);
fragments.add(Fragment.instantiate(this,MyFragment.class.getName(),page));
//after adding all the fragments write the below lines
this.mPagerAdapter = new PagerAdapter(super.getSupportFragmentManager(), fragments);
mPager.setAdapter(this.mPagerAdapter);
A sample fragment definition:
public class MyFragment extends Fragment {
public static MyFragment newInstance(String imageUrl) {
final MyFragment mf = new MyFragment ();
final Bundle args = new Bundle();
args.putString("somedata", "somedata");
mf.setArguments(args);
return mf;
}
public MyFragment() {}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String data = getArguments().getString("somedata");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate and locate the main ImageView
final View v = inflater.inflate(R.layout.my_fragment_view, container, false);
//...
return v;
}
FragmentPagerAdapter
public class MyFragmentAdapter extends FragmentPagerAdapter {
public static int pos = 0;
private List<Fragment> myFragments;
public MyFragmentAdapter(FragmentManager fm, List<Fragment> myFrags) {
super(fm);
myFragments = myFrags;
}
@Override
public Fragment getItem(int position) {
return myFragments.get(position);
}
@Override
public int getCount() {
return myFragments.size();
}
@Override
public CharSequence getPageTitle(int position) {
setPos(position);
String PageTitle = "";
switch(pos)
{
case 0:
PageTitle = "page 1";
break;
case 1:
PageTitle = "page 2";
break;
case 2:
PageTitle = "page 3";
break;
case 3:
PageTitle = "page 4";
break;
case 4:
PageTitle = "page 5";
break;
case 5:
PageTitle = "page 6";
break;
case 6:
PageTitle = "page 7";
break;
}
return PageTitle;
}
public static int getPos() {
return pos;
}
public static void setPos(int pos) {
MyFragmentAdapter.pos = pos;
}
}
Comments
-
CREW about 4 years
I'm using the default Swipe Tab Fragment code that Android starts with when you start a new Android application. I've figured out how to modify my data and use the tabs, but I haven't figured out how to add a simple fragment to what's already there. I wanted to add a infobar on the top of the tabs or right below them. I'm sure it's simple, I just can't figure out how lol. I learn by examples.
I've tried adding a view to viewpager, but my app is crashing, and I believe I'm totally doing it wrong.
In my MainActivity: ...
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Set up the action bar. final ActionBar actionBar = getActionBar(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); mSectionsPagerAdapter = new SectionsPagerAdapter( getSupportFragmentManager()); // Set up the ViewPager with the sections adapter. mViewPager = (ViewPager) findViewById(R.id.pager); mViewPager.setAdapter(mSectionsPagerAdapter); SubBarFragment infobar = new SubBarFragment(); mViewPager.addView(infobar.getView()); .....[extra code for menus and things] public class SectionsPagerAdapter extends FragmentPagerAdapter { public SectionsPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { ....[code to show specific tabs and return the tab's fragment]
infobarfragment.java
public class InfobarFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.infobar, container, false); return view; } }
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" />
infobar.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_wifi" /> <TextView android:id="@+id/statusText1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="Wifi Status Information" /> </LinearLayout>
-
CREW about 11 yearsHi Santhosh. This helps me understand how to add a fragment to my current adapter much easier! I can get a fragment added, but it just treats my fragment that I add like another page that I can swipe through. If I swipe to a different tab, I want my 'statusbar' fragment that I added to stay on the top or bottom no matter what page I swipe to. In essence, the statusbar is like a sub-actionbar. Just lets me user know the status of whats going on. Do I need to re-work my strategy?
-
SKK about 11 yearsThe fragments are added to the view Pager. I think you can create a layout(linearlayout[vertical]) for the fragment activity having <statusbar> fragment_container at the top and then viewpager below it.