3

フラグメントを削除する(再度作成する)たびに新しいViewPagerを作成するにはどうすればよいですか?私のポケットベルはフラグメントの破壊を生き延びています。

フラグメント内にViewPagerがありますが、FrameLayoutからフラグメントを削除して、追加し直したときに。彼のViewPagerは古いフラグメントインスタンスと同じですが(私はそうだと思います)、すべてのフラグメントがなくなっています(空のページャーは空です:()。ViewPagerを再作成するにはどうすればよいですか?

このコードは、フラグメントのonCreateView()メソッドにあります。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View fragment = inflater.inflate(getLayoutID(), container,false);
    ViewPager pager = (ViewPager) fragment.findViewById(R.id.myPager);

    PagerAdapter newAdapter = new MyPagerAdapter(getFragmentManager(), getFragments());
    pager.setAdapter(newAdapter);

    return fragment;
}

そして、私はあなたたちが知る必要があるのはそれだけだと思います。

4

1 に答える 1

2

フラグメント内にフラグメントを含めることができないことがわかったので、このViewPagerAdapterを、渡して表示できるビューの配列を使用して実行しました。コードは次のとおりです。

ViewPagerAdapter

import java.util.List;

import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;

public class ViewPagerAdapter extends PagerAdapter{

    private List<View> pages;

    public ViewPagerAdapter(List<View> pages) {
        this.pages = pages;
    }



    @Override  
    public Object instantiateItem(View collection, int position) {  
        ((ViewPager) collection).addView(pages.get(position),0);  

        return pages.get(position);  
    }  

    @Override
    public int getCount() {
        return pages.size();
    }

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

    /**  
     * Remove a page for the given position. The adapter is responsible  
     * for removing the view from its container, although it only must ensure  
     * this is done by the time it returns from {@link #finishUpdate()}.  
     *  
     * @param container The containing View from which the page will be removed.  
     * @param position The page position to be removed.  
     * @param object The same object that was returned by  
     * {@link #instantiateItem(View, int)}.  
     */  
    @Override  
    public void destroyItem(View collection, int position, Object view) {  
        ((ViewPager) collection).removeView((View) view);  
    }  

    @Override  
    public boolean isViewFromObject(View view, Object object) {  
        return view==((View)object);  
    }  

    /**  
     * Called when the a change in the shown pages has been completed. At this  
     * point you must ensure that all of the pages have actually been added or  
     * removed from the container as appropriate.  
     * @param container The containing View which is displaying this adapter's  
     * page views.  
     */  
    @Override  
    public void finishUpdate(View arg0) {}  

    @Override  
    public void restoreState(Parcelable arg0, ClassLoader arg1) {}  

    @Override  
    public Parcelable saveState() {  
        return null;  
    }  

    @Override  
    public void startUpdate(View arg0) {}  
}  

そして、ここに、抽象メソッドと出来上がりをオーバーライドできる追加の抽象フラグメントがあります。

AbstractPagerFragment

import java.util.List;

import templateDigital.util.ViewPagerAdapter;


import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public abstract class AbstractPagerFragment extends Fragment {

    private ViewPager pager;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment

        View fragment = inflater.inflate(getLayoutID(), container,false);
        setRetainInstance(false);
        PagerAdapter mPagerAdapter = new ViewPagerAdapter(getViews());
        pager = (ViewPager) fragment.findViewById(getPagerID());
        pager.setAdapter(mPagerAdapter);
        pager.getAdapter().notifyDataSetChanged();

        return fragment;
    }


    public abstract List<View> getViews();

    public abstract int getLayoutID();

    public abstract int getPagerID();

    @Override
    public void onDestroy() {
        super.onDestroy();
        pager = null;
        System.gc();
    }


}
于 2012-06-19T20:47:51.793 に答える