ViewPager一直在重新创建片段

时间:2015-08-26 13:46:45

标签: android android-viewpager fragment

我正在使用ViewPager和我的片段。所有片段都有动画,当切换回来时它不起作用可能是因为ViewPager以某种方式保存了近片段的状态,你是否知道如何避免它?

getItemPosition()在这种情况下不做任何事情

private class MyFragmentPagerAdapter extends FragmentPagerAdapter {

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

    @Override
    public CharSequence getPageTitle(int position) {
        return null;
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
                return GetStartedOneFragment.newInstance();
            case 1:
                return GetStartedTwoFragment.newInstance();
            case 2:
                return GetStartedThreeFragment.newInstance();
            case 3:
                return GetStartedFourFragment.newInstance();
            case 4:
                return GetStartedFiveFragment.newInstance();
            case 5:
                return GetStartedSixFragment.newInstance();
            default:
                return GetStartedOneFragment.newInstance();
        }
    }

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

    @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }

}

1 个答案:

答案 0 :(得分:1)

我使用片段作为滑块内容,请参阅下面的示例代码。如果需要,请随时询问更多详细信息。 我在这个例子中有4种飞行模式。 ViewPager 与关联的适配器(ScreenSlidePagerAdapter)一起使用。 您可以在Play商店中查看该应用以查看滑块(搜索“Flight Recorder 24”)。

// In the main fragment java code

private View headerView;
private ViewPager mPager;
public ScreenSlidePagerAdapter mPagerAdapter;

// ...
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState)
{
    super.onCreateView(inflater, container, savedInstanceState);

    View mainView = inflater.inflate(R.layout.monitoring_fragment,container, false);

    // The header of the list
    View view = inflater.inflate(R.layout.header_monitoring_fragment, mListView, false);
    headerView = view;

//...

    mPager = (ViewPager) view.findViewById(R.id.pager);

    FragmentManager fm = getChildFragmentManager();
    mPagerAdapter = new ScreenSlidePagerAdapter(fm);
    mPager.setAdapter(mPagerAdapter);
        mPager.setCurrentItem(UserConfiguration.getUserConf().getPositionFromFlightMode());

    // Attach the page change listener inside the activity
    mPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener()
    {

        // This method will be invoked when a new page becomes selected.
        @Override
        public void onPageSelected(int position)
        {
            int flight_mode = UserConfiguration.getFlightModeFromPosition(position);
            UserConfiguration.getUserConf().setFlightMode(flight_mode);
        }

        // This method will be invoked when the current page is scrolled
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
        {
            // Code goes here
        }

        // Called when the scroll state changes:
        // SCROLL_STATE_IDLE, SCROLL_STATE_DRAGGING, SCROLL_STATE_SETTLING
        @Override
        public void onPageScrollStateChanged(int state)
        {
            // Code goes here
        }
    });

// ...
} 

// ...

// Slider adapter
private class ScreenSlidePagerAdapter extends FragmentPagerAdapter
{
    public ScreenSlidePagerAdapter(FragmentManager fm)
    {
        super(fm);
    }

    @Override
    public Fragment getItem(int position)
    {
        // position to flight mode
        int flight_mode = UserConfiguration.getFlightModeFromPosition(position);

        FlightModeFragment flightModeFragment = FlightModeFragment.newInstance(flight_mode);

        return flightModeFragment;
    }

    public int getItemPosition(Object object)
    {
        return POSITION_NONE;
    }

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

然后你必须用你的滑块内容创建一个Fragment(这里是 FlightModeFragment 类),它将用一个整数来实现,以识别嵌入到Bundle savedInstanceState中的页面(我有4页)

public class FlightModeFragment extends Fragment
{
LinearLayout mainLayout;
ImageView live15minImageView;
ImageView modeImageView;
ImageView imageViewLeft;
ImageView imageViewRight;
private TextView textViewRecord;
private TextView textViewGps;
int flight_mode = UserConfiguration.AC_LISTENER_TRAVEL_RECORDER_MODE;

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

    // handle fragment arguments
    Bundle arguments = getArguments();
    if(arguments != null)
    {
        flight_mode = arguments.getInt("flight_mode");
    }
}

// ...

}