【问题标题】:Contents of Viewpager lost on rotationViewpager 的内容在旋转时丢失
【发布时间】:2014-01-08 11:17:28
【问题描述】:

我有一个项目,它有一个 MainActivity,它托管一个片段,该片段通过 Viewpager 托管另外两个片段。第一次启动时看起来不错,但是当我旋转时,Viewpager 中的两个片段丢失了。我尝试将 getFragmentManager 更改为 getChildFragmentManager 但我会得到一个非法状态异常:无法保留嵌套在其他片段中的片段。

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;
}

} }

【问题讨论】:

  • 碎片“丢失”是什么意思?
  • 它们在应用程序第一次启动时出现,但是当我旋转屏幕时,viewpager 在片段应该在的地方是空白的。

标签: android android-fragments android-viewpager pagerslidingtabstrip


【解决方案1】:

答案其实超级简单,就是用 FragmentStatePagerAdapter 代替 FragmentPagerAdapter

【讨论】:

    【解决方案2】:

    可能,如果你想保留片段实例,你可以尝试使用这个,

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

    干杯!!

    【讨论】:

    • 不幸的是没有帮助
    【解决方案3】:

    在创建新片段之前先搜索原始片段。您可以按您为片段提供的 id 或标签进行搜索。这是一个例子。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-04
      相关资源
      最近更新 更多