简体   繁体   中英

Android Fragment not showing inside Viewpager

I have an android application using swipe tabs to navigate between fragments. I have 2 fragments defined in xml file and 1 main activity. Whenever I run my application I'm getting the tabs to show up properly with the correct names "Administration", "Scan", "About"... but the page is blank. When I step through my debugger to check the return value of onCreateView (in my FragmentPagerAdapter code below) it appears to be returning correct value... I can't figure out why I keep getting a blank screen. Can someone please help?

Here is my

<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="com.atd.giftmonster.MainActivity" />

Here is my

public class MainActivity extends ActionBarActivity implements ActionBar.TabListener {

ViewPager mViewPager;
DFragmentManager mFragmentManager;

private static EditText textEmail;
private static EditText textPw;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    List<String> titles = new ArrayList<String>();
    titles.add("administrator");
    titles.add("scan");
    titles.add("about");

    List<Integer> layoutids = new ArrayList<Integer>();
    layoutids.add(R.layout.fragment_admin);
    layoutids.add(R.layout.fragment_scan);
    layoutids.add(R.layout.fragment_scan);

    // Set up the action bar.
    final ActionBar actionBar = getSupportActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    mFragmentManager = new DFragmentManager(getSupportFragmentManager(), layoutids, titles);

    // Set up the ViewPager with the sections adapter.
    mViewPager = (ViewPager) findViewById(R.id.pager);
    mViewPager.setAdapter(mFragmentManager);

    // When swiping between different sections, select the corresponding
    // tab. We can also use ActionBar.Tab#select() to do this if we have
    // a reference to the Tab.
    mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
            actionBar.setSelectedNavigationItem(position);
        }
    });

    // For each of the sections in the app, add a tab to the action bar.
    for (int i = 0; i < mFragmentManager.getCount(); i++) {
        actionBar.addTab(
                actionBar.newTab()
                        .setText(mFragmentManager.getPageTitle(i))
                        .setTabListener(this));
    }
}

Here is my w/

public class DFragmentManager extends FragmentPagerAdapter {

List<String> mTitle;
List<Integer> mLayoutID;
List<Fragment> mFragments;
FragmentManager mFragmentManager;

public DFragmentManager(FragmentManager fm, List<Integer> layoutIDs, List<String> layoutTitles)
{
    super(fm);
    mFragments = new ArrayList<Fragment>();

    mLayoutID = layoutIDs;
    mFragmentManager = fm;
    mTitle = layoutTitles;

    int size = mLayoutID.size();

    for (int i = 0; i < size; i++)
    {

        mFragments.add(DFragment.newInstance(mLayoutID.get(i)));
    }
}

@Override
public Fragment getItem(int position)
{
    return mFragments.get(position);
}

@Override
public int getCount()
{
    return mFragments.size();
}

@Override
public CharSequence getPageTitle(int position) {
    //return (CharSequence)new String("ss");
    //return (CharSequence) mFragments.get(position).getTitle();
    return (CharSequence) mTitle.get(position);
}

public Fragment getFragment(int position)
{
    return mFragments.get(position);
}

public static class DFragment extends Fragment
{
    private View mView;
    private static final String ARG_LAYOUT_ID = "layout_id";

    public DFragment()
    {
        mView = null;
    }

    public static final DFragment newInstance(int layoutID)
    {
        DFragment fragment = new DFragment();
        Bundle bundle = new Bundle();
        bundle.putInt(ARG_LAYOUT_ID, layoutID);
        fragment.setArguments(bundle);
        return fragment;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup group, Bundle bundle)
    {
        int resourceID = getArguments().getInt(ARG_LAYOUT_ID);
        mView = inflater.inflate(resourceID, group, false);
        return mView;
    }

    public View getView()
    {
        return mView;
    }
}

edit:

It's been a while since I revised this problem but I fixed it by not passing the R.id.fragmetnid to the fragment in the args. (the List layoutIds variable). Instead I would pass my own designated id then inflate the fragment within the onCreateView. Seems to be working now.

Try this version of code in your activity:

public class SampleSwipeActivity extends FragmentActivity implements ActionBar.TabListener {

   private ViewPager viewPager;
   private ActionBar actionBar;
   private TabsPagerAdapter mAdapter;


   @Override
   public void onCreate(Bundle savedInstanceState)
   {
      super.onCreate(savedInstanceState);

      requestWindowFeature(Window.FEATURE_ACTION_BAR);
      setContentView(R.layout.main);

      viewPager = (ViewPager) findViewById(R.id.pager);
      actionBar = getActionBar();

      actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

      String [] tabs = new String[]{"Tab1", "Tab2", "Tab3", "Tab4"};


      for(String tab : tabs)
      {
         actionBar.addTab(actionBar.newTab()
                .setText(tab)
                .setTabListener(this));
      }

      mAdapter = new TabsPagerAdapter(getSupportFragmentManager());
      viewPager.setAdapter(mAdapter);

   }



   @Override
   public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft)
   {
       viewPager.setCurrentItem(tab.getPosition());

       viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener()
       {

          @Override
          public void onPageSelected(int position)
          {
             actionBar.setSelectedNavigationItem(position);
          }

          @Override
          public void onPageScrolled(int arg0, float arg1, int arg2)
          {
          }

          @Override
          public void onPageScrollStateChanged(int arg0)
          {
          }
       });
   }

   @Override
   public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {

   }

   @Override
   public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {

   }
}

Since you are using Fragments, I would use FragmentActivity instead of ActionBarActivity.

I hope this helps.

On your code, you can change

// Set up the ViewPager with the sections adapter.
    mViewPager = (ViewPager) findViewById(R.id.pager);

with this

// Set up the ViewPager with the sections adapter.
    mViewPager = (android.support.v4.view.ViewPager) findViewById(R.id.pager);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM