7

我有一個MainActivity項目,它承載了一個通過Viewpager承載另外兩個碎片的碎片。它在第一次啓動時看起來很好,但是當我旋轉時,Viewpager中的兩個片段都會丟失。我試着將getFragmentManager改爲getChildFragmentManager,但是我會得到一個非法狀態異常:無法保留嵌套在其他片段中的fragements。Viewpager丟失的內容

MainActivity.java:

import android.app.ActionBar; 
import android.os.Bundle; 
import android.view.MenuItem; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 

import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu; 
import com.jeremyfeinstein.slidingmenu.lib.app.SlidingFragmentActivity; 

public class MainActivity extends SlidingFragmentActivity { 
@TargetApi(11) 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_main); 
    getSupportFragmentManager() 
    .beginTransaction() 
    .replace(R.id.mainContentFrame, new WorkOutsContainerFrag()) 
    .commit(); 


    setBehindContentView(R.layout.menu); 

    ActionBar actionBar = getActionBar(); 

     populate(); 

     SlidingMenu menu = getSlidingMenu(); 

     menu.setMode(SlidingMenu.LEFT); 
     menu.setShadowWidthRes(R.dimen.shadow_width); 
     menu.setShadowDrawable(R.drawable.shadow); 
     menu.setBehindWidthRes(R.dimen.slidingmenu_offset); 
     menu.setFadeDegree(0.35f); 
     menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN); 
     menu.setSlidingEnabled(false); 
     setSlidingActionBarEnabled(true); 

     actionBar.setDisplayHomeAsUpEnabled(true); 



    } 


    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     case android.R.id.home: 
      toggle(); 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
     } 
    } 

    private void populate() { 

     ListView lv = (ListView) findViewById(R.id.listView1); 
     String[] values = new String[] { "Workouts", "Information", "Ladders"}; 
     ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_1, android.R.id.text1, values); 
     lv.setAdapter(adapter); 


    } 

}

WorkoutsContainerFrag.java:

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.util.TypedValue; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

import com.astuetz.PagerSlidingTabStrip; 

public class WorkOutsContainerFrag extends Fragment { 

private PagerSlidingTabStrip tabs; 
private ViewPager pager; 
private WorkoutsPagerAdapter adapter; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.workoutscontainer, container, false); 

    setRetainInstance(true); 

    tabs = (PagerSlidingTabStrip) view.findViewById(R.id.workoutstabs); 
    pager = (ViewPager) view.findViewById(R.id.workoutspager); 
    adapter = new WorkoutsPagerAdapter(getFragmentManager()); 

    pager.setAdapter(adapter); 

    final int pageMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4, getResources() 
      .getDisplayMetrics()); 
    pager.setPageMargin(pageMargin); 

    tabs.setViewPager(pager); 

    return view; 

}

private GymWorkoutsFragment gymWorkoutsFragment; 
private OCWorkoutsFragment ocWorkoutsFragment; 

public class WorkoutsPagerAdapter extends FragmentPagerAdapter { 

    private final String[] TITLES = {"Gym Workouts", "OC Workouts"}; 

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


    @Override 
    public CharSequence getPageTitle(int position) { 
     return TITLES[position]; 
    } 

    @Override 
    public int getCount() { 
     return TITLES.length; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     switch (position) { 
     case 0: 
      gymWorkoutsFragment = new GymWorkoutsFragment(); 
      return (Fragment)gymWorkoutsFragment; 

     case 1: 
      ocWorkoutsFragment = new OCWorkoutsFragment(); 
      return (Fragment)ocWorkoutsFragment; 

    } 
     return null; 
} 

} }

+0

更換FragmentPagerAdapter你是什麼意思的片段「丟失」是什麼意思? – DroidT

+0

它們在應用程序首次啓動時顯示,但是當我旋轉屏幕時,viewpager在片段應該是空白處。 – Racepace

回答

18

其實答案非常簡單,它是與FragmentStatePagerAdapter

+0

完美的工作,感謝一百萬 – Hilal

0

在創建新片段之前先搜索原始片段。您可以通過您提供片段的標識或標籤進行搜索。這是一個例子。

WorkOutsContainerFrag fragment = (WorkOutsContainerFrag) getFragmentManager().findFragmentById(R.id.workout_frag_id); 

if(fragment == null) { 
    fragment = new WorkOutsContainerFrag(); 
} 
getSupportFragmentManager().beginTransactoin().replace(R.id.mainContentFrame,fragment).commit(); 
4

也許,如果u希望保留片段比如,你可以嘗試使用這個,

ViewPager pager = (ViewPager) findViewById(R.id.viewPager); 
pager.setOffscreenPageLimit(2); // No of fragments to be preserved 

乾杯!

+0

不好意思 – Racepace