How can I add a fragment to a ViewPager? addView crashes my app

27,720

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;
 }
}
Share:
27,720
CREW
Author by

CREW

Program as a Hobby

Updated on April 26, 2020

Comments

  • CREW
    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
    CREW about 11 years
    Hi 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
    SKK about 11 years
    The 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.