简体   繁体   English

Android片段未显示在Viewpager中

[英]Android Fragment not showing inside Viewpager

I have an android application using swipe tabs to navigate between fragments. 我有一个使用滑动选项卡在片段之间导航的android应用程序。 I have 2 fragments defined in xml file and 1 main activity. 我在xml文件中定义了2个片段,并进行了1个主要活动。 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. 当我逐步通过调试器检查onCreateView的返回值(在下面的FragmentPagerAdapter代码中)时,似乎返回的是正确的值...我不知道为什么我总是得到空白屏幕。 Can someone please help? 有人可以帮忙吗?

Here is my activity_main.xml 这是我的activity_main.xml

<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 MainActivity.java 这是我的MainActivity.java

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 FragmentPagerAdapter w/ static fragment class 这是我的带有静态片段类的 FragmentPagerAdapter

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. 自修改此问题以来已有一段时间,但我通过不将R.id.fragmetnid传递给args中的片段来解决此问题。 (the List layoutIds variable). (List layoutIds变量)。 Instead I would pass my own designated id then inflate the fragment within the onCreateView. 相反,我将传递自己的指定ID,然后在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. 由于您使用的是片段,因此我将使用FragmentActivity而不是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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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