![](/img/trans.png)
[英]PropertyDetailPagerAdapter, how to handle orientation changes correctly?
[英]FragmentPagerAdapter - How to handle Orientation Changes?
我使用FragmentPagerAdapter
包含幾個需要通知database
更改的片段。 我通過迭代實現回調接口的片段並調用refreshData()
方法來完成此操作。
這可以正常工作,直到設備改變方向。 在方向更改后,即使方法調用似乎有效,片段UI也不會明顯刷新。
從我到目前為止所讀到的,這是因為FragmentPagerAdapter
處理片段生命周期,並且接收回調的片段不是實際顯示的片段。
private class DataPagerAdapter extends FragmentPagerAdapter {
private DataFragment[] fragments = new DataFragment[] {
new FooDataFragment(), BarDataFragment()};
public DataPagerAdapter(android.support.v4.app.FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return fragments[position];
}
@Override
public int getCount() {
return fragments.length;
}
public DataFragment[] getFragments() {
return fragments;
}
}
protected void refreshData() {
for (DataFragment dataFragment : mPagerAdapter.getFragments()) {
dataFragment.refreshData();
}
我在每個片段中使用廣播接收器暫時解決了這個問題,但這個解決方案似乎很浪費,可能會造成內存泄漏。 如何正確解決這個問題? 我在橫向模式下使用不同的布局和邏輯,因此我想在方向更改后使用新創建的片段。
是的,就像你說FragmentManager在方向改變后處理片段所以不調用適配器中的getItem
。 但是你可以覆蓋方法instantiateItem()
,它甚至在方向改變后被調用,並將Object轉換為Fragment並將其保存在數組中。
@Override
public Object instantiateItem(ViewGroup container, int position) {
DataFragment fragment = (DataFragment) super.instantiateItem(container, position);
fragments[position] = fragment;
return fragment;
}
難道你不能在AndroidManifest.xml中的Activity上設置android:configChanges標志,以防止重新創建活動嗎?
<activity
android:name="com.example.test.activity.MainActivity"
android:configChanges="orientation|screenSize|keyboardHidden"/>
在那里你可以找到更多的可能性: https : //android.jlelse.eu/handling-orientation-changes-in-android-7072958c442a
我有類似的問題我的工作解決方案:在活動中,適配器調用adapter.notifyDataSetChanged();
覆蓋適配器中的getItemPostion()方法
@Override
public int getItemPosition(Object object) {
MyFragment frag = (MyFragment)object;
frag.refresh();
return POSITION_UNCHANGED;
}
我的FragmentStatePagerAdapater
(我的適配器)只包含一種類型的片段,但我認為,您可以使用instanceof
(對於更多類型的片段)然后使用強制轉換或每個片段將實現接口與方法refresh()
然后在Fragment中添加方法refresh()
)並使用此實現:
public void refresh() {
LayoutInflater inflater = LayoutInflater.from(getActivity());
ViewGroup viewGroup = (ViewGroup) getView();
viewGroup.removeAllViewsInLayout();
View view = onCreateView(inflater, viewGroup, null);
viewGroup.addView(view);
}
這對我有用。 我的觀點:問題來了,當設備改變方向時,適配器被破壞,但是片段仍在內存中,系統嘗試在方向改變后重用它們,但片段中包含的視圖也被破壞,片段需要要“重新創建”(調用onCreateView
方法)。 也許我錯了,所以請糾正我....
(對不起我的英語不好 )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.