5

我使用的是ActionBarSherlock(基本上是Android支持包的擴展)。ViewPager + FragmentStatePagerAdapter:ViewPager在屏幕方向更改時停止工作

我想要做的是以下幾點:

我有一個FragmentActivity它承載只是一個單一的ViewPager。這ViewPager有一個FragmentStatePagerAdapter(因爲將來會有很多項目)。但現在它只裝載了2個項目進行測試。

一切都很好,而我在縱向方向。但是,當我改變如此橫向方向時,它會切換回適配器中的第一項(這是好的,因爲一切都重新加載等),但我無法Swype到下一個項目。沒有什麼事情發生。

從調試我可以看到,Loader返回這兩個項目就好了。 getItem(...)也被稱爲position 0和1.所以basicall一切看起來很好,除了它不是;)

btw:同樣的事情發生反之亦然,當我開始在景觀方向和切換到縱向方向。

任何想法可能是錯誤的嗎?

下面是我的一些代碼:

public class QuotesStatePagerAdapter extends FragmentStatePagerAdapter { 

private List<Quote> mQuotes; 

public QuotesStatePagerAdapter(FragmentManager fm, List<Quote> quotes) { 
    super(fm); 
    mQuotes = quotes; 
} 

@Override 
public Fragment getItem(int position) { 
    Bundle arguments = new Bundle(); 
    arguments.putSerializable("quote", mQuotes.get(position)); 
    QuoteFragment fragment = new QuoteFragment(); 
    fragment.setArguments(arguments); 
    return fragment; 
} 

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

}

public QuotesFragment() { 
} 

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

public void updateOrdering(ORDERING newOrdering) { 
    mOrdering = newOrdering; 
    getLoaderManager().getLoader(0).startLoading(); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.quotes, container, false); 
} 

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    mViewPager = (ViewPager) view.findViewById(R.id.viewpager); 
    mViewPager.setOnPageChangeListener(this); 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    getLoaderManager().initLoader(0, null, this); 
} 

@Override 
public Loader<List<Quote>> onCreateLoader(int id, Bundle args) { 
    return new QuotesLoader(getActivity(), mCategoryId); 
} 

@Override 
public void onLoadFinished(Loader<List<Quote>> loader, List<Quote> data) { 
    mQuotes = data; 
    mViewPager.setAdapter(new QuotesStatePagerAdapter(
      getSupportFragmentManager(), mQuotes)); 
} 

回答

-2

嘗試增加android:configChanges="orientation"體現內部活動標籤

+0

不會改變行爲... – Goddchen 2012-02-18 16:05:28

+0

在我的項目中,當我初始化標籤主機時,我註釋掉了標籤初始化'protected void onCreate(Bundle savedInstanceState){this。 initialiseTabHost(savedInstanceState); (保存實例狀態!=空){ mTab​​Host.setCurrentTabByTag(savedInstanceState.getString(「tab」)); //根據已保存的狀態設置標籤 } * /}'解決了與android:configChanges =「orientation」結合使用時的方向錯誤'' – JackMahoney 2012-02-18 21:41:06

12

機器人:configChanges = 「方向」 就像一個魅力的工作,但我看到它不是由android團隊推薦的(僅限最後一種情況)...請參閱http://developer.android.com/guide/topics/manifest/activity-element.html#config

我發現放: setRetainInstance(true);在每個片段的onCreateView保留實例做的伎倆。 (請不要再次調用onActivityCreated)

+2

setRetainInstance(true);在onCreate是解決方案!謝謝 – passsy 2012-07-22 17:41:58