2014-01-30 55 views
5

我有一个viewpager在一个片段中,我显示了3个片段,但是当我第一次打开片段时,它打开的很好,当我移动到另一个片段并返回到viewpager片段时,它不会在查看寻呼机中不显示片段,然后我必须改变手机的方向,或者不断刷看视图,以显示隐藏的片段。保留viewpager片段的状态android

我用Google搜索它,现在我知道我要的标签设置为每个片段并用findfragmentbytag方法来检索片段,但问题是,当我尝试设置标签片段

getSupportFragmentManager().beginTransaction().add(myFragment, "Some Tag").commit(); 

上面一行崩溃我应用程序和logcat显示“不能设置标记到片段”,我知道我在做一些愚蠢的错误

这是我的片段的完整代码。如果能指导我在哪里编写用于设置片段标签的代码,我将非常感激。提前致谢。

public class MatchesListingFragment extends Fragment implements ActionBar.TabListener { 

    Context context; 
    SectionsPagerAdapter mSectionsPagerAdapter; 
    ViewPager mViewPager; 
    ActionBar actionBar; 
    Matchlistings db; 
    Bundle savedInstanceState; 

    Fragment livescore,fixture,results; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 

     this.savedInstanceState = savedInstanceState; 
     db = new Matchlistings(getActivity()); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.fragment_matches, container, false); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     context = getActivity().getApplicationContext(); 

     if(savedInstanceState == null){ 
      livescore = new LiveScoreListingFragment(); 
      fixture = new FixturesListingFragment(); 
      results = new ResultsListingFragment(); 
     } 

     if(!Constants.is_listing_refreshed){ 
      Log.i(MainActivity.TAG,"refreshing list"); 
      db.loadListingsFromServer().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
     } 

     actionBar = getActivity().getActionBar(); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

     if(mSectionsPagerAdapter == null) 
     mSectionsPagerAdapter = new SectionsPagerAdapter(getActivity().getSupportFragmentManager()); 
     mViewPager = (ViewPager) getView().findViewById(R.id.pager); 
     mViewPager.setAdapter(mSectionsPagerAdapter); 

     mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
      @Override 
      public void onPageSelected(int position) { 
       actionBar.setSelectedNavigationItem(position); 
      } 
     }); 


     for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) { 
      Tab tb = actionBar.newTab() 
      .setText(mSectionsPagerAdapter.getPageTitle(i)) 
      .setTabListener(this); 

      actionBar.addTab(tb); 

     } 
    } 

    public class SectionsPagerAdapter extends FragmentPagerAdapter { 
     Fragment fragment; 

     public SectionsPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      switch(position){ 
      case 0: 

       fragment = livescore; 
       return fragment; 
      case 1: 
       fragment = fixture; 
       return fragment; 
      case 2: 
       fragment = results; 
       return fragment; 
      case 3: 
       fragment = new LiveScoreListingFragment(); 
       return fragment; 
      } 
      return null; 
     } 

     @Override 
     public int getCount() { 
      return 4; 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      switch (position) { 
      case 0: 
       return "LIVE"; 
      case 1: 
       return "FIXTURES"; 
      case 2: 
       return "RESULTS"; 
      case 3: 
       return "HOT"; 
      } 
      return null; 
     } 
    } 

    @Override 
    public void onDestroy() { 
     // TODO Auto-generated method stub 
     super.onDestroy(); 
     actionBar.removeAllTabs(); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); 
    } 

    @Override 
    public void onTabReselected(Tab arg0, FragmentTransaction arg1) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onTabSelected(Tab arg0, FragmentTransaction arg1) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onTabUnselected(Tab arg0, FragmentTransaction arg1) { 
     // TODO Auto-generated method stub 

    } 

} 

enter image description here

编辑: 我现在已经试图通过标签来得到viewpager的片段,而不是创造新的片段,每次的。但问题仍然是一样的。

FixturesListingFragment fixture = (FixturesListingFragment) getActivity().getSupportFragmentManager().findFragmentByTag("android:switcher:"+R.id.pager+":1"); 
       if(fixture == null) 
        fixture = new FixturesListingFragment(); 
+0

FragmentPagerAdapter使用标签本身 – MGDroid

+0

我该如何使用它来获取片段? –

回答

0

试试下面所提到保留实例:

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

    //add this line 
    setRetainInstance(true); 

    context = getActivity().getApplicationContext(); 
+0

不能正常工作.... –

10

您是否尝试过使用setOffscreenPageLimit?如果您有3个页面,则将其设置为2.即使应用处于闲置状态,这种方式也不会重新创建页面。这里是link

+0

抛出空指针例外:S –

+0

在设置适配器后使用它,页数为4,您应该将其设置为3的屏幕外页限制。 – Angmar

+0

mViewPager.setAdapter(mSectionsPagerAdapter); mViewPager.setOffscreenPageLimit(3); 我做到了这一点,我仍然得到pullpointer更新问题,以显示屏幕截图... –

4

我已经改变FragmentPagerAdapter到FragmentStatePagerAdapter固定的问题... 这是我在这个link

/** 
    * The {@link android.support.v4.view.PagerAdapter} that will provide fragments for each of the 
    * three primary sections of the app. We use a {@link android.support.v4.app.FragmentPagerAdapter} 
    * derivative, which will keep every loaded fragment in memory. If this becomes too memory 
    * intensive, it may be best to switch to a {@link android.support.v4.app.FragmentStatePagerAdapter}. 
    */ 

下载示例应用程序读取和改变..但仍然不知道应该有办法做到这一点与FragmentPagerAdapter

2

我已经解决了通过使用setOffScreenpageLimit(int)到我有的附加选项卡的数量的问题。

private void setupViewPager(ViewPager viewPager) { 
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
    adapter.addFragment(new FragmentHome(), "Home"); 
    adapter.addFragment(new FragmentEProfile(), "e-Profile"); 
    adapter.addFragment(new FragmentResults(), "Results"); 
    adapter.addFragment(new FragmentOutpass(), "Outpass"); 
    viewPager.setAdapter(adapter); 
    viewPager.setOffscreenPageLimit(3); 
}