簡體   English   中英

如何在方向更改時保存ViewPager中的碎片狀態

[英]How to save state of Fragments in ViewPager when orientation changes

我有一個實現ActionBarSherlock的應用程序,它主要由ViewPager組成,具有不同的片段內容(對於每個頁面),帶有ViewPager指示符。

這是我的onCreate方法的活動,擴展了SherlockFragmentActivity

// Assume that tabs,sources,types are string arrays e.g. tabs = ["tab1","tab2","tab3"]
// types = ["listview","listview","webview"]
// according to the type of each tab, the type of content of the fragment associated to that tab is determined (e.g. WebView or ListView)
@Override
public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);

srcContext = getBaseContext();
srcActivity = SaudiActivity.this;

int selectPos = 0;


Intent sender = getIntent();

FragmentPagerAdapter mAdapter = new NewsListAdapter(
            getSupportFragmentManager());
ViewPager pager = (ViewPager) findViewById(R.id.pager);
pager.setAdapter(mAdapter);

TabPageIndicator indicator = (TabPageIndicator) findViewById(R.id.indicator);
    indicator.setViewPager(pager);
    pager.setOffscreenPageLimit(tabs.length);
    pager.setCurrentItem((tabs.length - 1));
    currentPosition = (tabs.length - 1);

    indicator.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
            currentPosition = position;
            if ((type[position] == "listview" || type[position]
                    .equals("listview")) && loaded[position] == false) {
                loaded[position] = true;
                getNews(listViews[position], position);
            }
        }

        @Override
        public void onPageScrolled(int position, float positionOffset,
                int positionOffsetPixels) {
        }

        @Override
        public void onPageScrollStateChanged(int state) {
        }
    });

    getSupportActionBar().setCustomView(R.layout.logo);
    getSupportActionBar().setDisplayShowCustomEnabled(true);
    getSupportActionBar().setDisplayHomeAsUpEnabled(false);
    getSupportActionBar().setDisplayShowTitleEnabled(false);
    getSupportActionBar().setDisplayShowHomeEnabled(false);

    Context ctx = getSupportActionBar().getThemedContext();

    SourcesAdapter adapter = new SourcesAdapter(ctx,
    R.layout.navigation_list_item, src_name, icons, src_value);

}

這是我的新聞列表適配器(創建片段),

    public static class MyViewHolder {
    public TextView title;
    public ImageView icon;
}

class NewsListAdapter extends FragmentPagerAdapter {

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

    @Override
    public Fragment getItem(int position) {
        return new NewsFragment(MyActivity.this, position);
    }

    // This is the number of pages -- 5
    @Override
    public int getCount() {
        return tabs.length;
    }

    // This is the title of the page that will apppear on the "tab"
    public CharSequence getPageTitle(int position) {
        return tabs[position];
    }

}

public List<NewsItem> NewsItems;

最后這是我的NewsFragment:

public static class NewsFragment extends Fragment {

    private int position;

    public NewsFragment() {
    }

    public NewsFragment(Context ctx, int pos) {
        this.position = pos;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,

    Bundle savedInstanceState) {
        View view = null;
        if (type[position].equals("listview")) {
            // Put a ListView in the Fragment
        } else {
            // Put a WebView in the Fragment
        }
        return view;
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
    }
}

讓片段通過重寫onSaveInstanceState並將必要的值放入outState來處理它的狀態。 使用savedInstanceState在onCreateView中恢復該狀態。 另外我很確定如果你使用Actionbarsherlock片段需要擴展SherlockFragment而不是Fragment。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM