簡體   English   中英

FragmentPagerAdapter - 如何處理方向更改?

[英]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.

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