android - 我关于如何保存Fragment状态的问题,跪求大神。
黄舟
黄舟 2017-04-17 17:28:12
0
4
528

首先最近在一个类似于商城的应用!需要实现的功能就是像京东,淘宝类似的,点击一个类别出现类别中的商品!我遇到的问题就是如何保存Fragment的状态!!直接上代码:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.choose_goods, container, false);
initView(view);
for (BdClass bdCls : clsList)
{
if (bdCls.getCLS_NO().length() == 6)
{
RadioButton button = new RadioButton(getActivity());
View lView = new View(getActivity());
lView.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, 3));
button.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
lView.setBackgroundDrawable(getResources().getDrawable(
R.drawable.stoke_settings_ed));
button.setId(Integer.valueOf(bdCls.getCLS_NO()));
button.setButtonDrawable(null);
button.setGravity(Gravity.CENTER);
button.setText(bdCls.getCLS_NAME());
button.setBackgroundDrawable(getResources().getDrawable(
R.drawable.selector_radiobtn));
clsListView.addView(button);
clsListView.addView(lView);
}
}
return view;
}

private void initView(View view)
{
clsListView = (RadioGroup) view.findViewById(R.id.gds_cls);
clsListView.setOnCheckedChangeListener(this);
checkBill = (Button) view.findViewById(R.id.checkBill);
checkBill.setOnClickListener(this);
manager = getActivity().getFragmentManager();

}
@Override
public void onCheckedChanged(RadioGroup arg0, int arg1)
{
    List<BdGoods> list = new ArrayList<BdGoods>();
    for (BdGoods gds : gdsList)
    {
        if (arg0.getCheckedRadioButtonId() == Integer.valueOf(gds
       .getCLS_NO()))
       {
          list.add(gds);
       }
}
   transaction = manager.beginTransaction();
    GoodsListFragment fragment = new GoodsListFragment(this, list);
   transaction.replace(R.id.listFragment, fragment);
  transaction.commit();
}

总的逻辑就是首先循环创建RadioGroup的子类,通过点击事件的改变来添加相应的Fragment,我只用了一个Fragment类。传数据进去就好了。那么现在我想问如何才能有效的保存Fragment的状态呢?Thanks for advance!!!

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回覆(4)
Ty80

1.你只用一個fragment。那麼,你不需要每次都呼叫replace方法,replace一次就夠了,刷新頁面你只需要在fragment裡面提供一個set方法,然後在外面調用。

程式碼如下:
    if(fragment == null){
        transaction = manager.beginTransaction();
        GoodsListFragment fragment = new GoodsListFragment(this, list);
        // 你需要设置一个tag来方便找到fragment
        transaction.replace(R.id.listFragment, fragment, GoodsListFragment.class.toString);
        transaction.commit();
    } else {
        fragment.setList(list);
    }

2.你需要考慮activity被回收以後的fragment的恢復問題。並且你需要把你的fragment從臨時變數修改成成員變數。

程式碼如下:
    private GoodsListFragment mFragment;
    @Override
    public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
        super.onViewStateRestored(savedInstanceState);
        if(savedInstanceState != null){
            FragmentManager fm = getChildFragmentManager();
            mFragment = (GoodsListFragment) fm.findFragmentByTag(GoodsListFragment.class.toString);
        }
    }

3.題主複寫了onCreateView方法,想必是在fragment裡面再嵌套fragment。你需要使用特殊的FragmentManager。

程式碼如下:
FragmentManager fragmentManager = this.getChildFragmentManager();

另外,建議在創建Fragment的時候,建議使用靜態工廠模式,不要在fragment構造方法中添加任何參數,這樣不利於fragment被銷毀了以後的恢復。同時也不建議把當前fragment傳遞給其他fragment,這樣會增加耦合,不利於fragment的維護和復用,你可以在GoodsListFragment.java中添加如下方法。

    private static final String EXTRA_KEY = "extra_key_bd_goods";
    
    public static GoodsListFragment newInstance(List<BdGoods> list) {
        Bundle args = new Bundle();
        args.putParcelableArrayList(EXTRA_KEY, list);
        GoodsListFragment fragment = new GoodsListFragment();
        fragment.setArguments(args);
        return fragment;
    }
洪涛

不要用 transaction.replace,這個是替換,銷毀舊的fragment。可以用add和hide來切換。但是容易記憶體溢位

Ty80

我選狗帶了!

PHPzhong

1.在Activity中建立Fragment
2.在Fragment中加入成員變數mRootView,
3.在onCreateView中:

if(mRootView == null){
    mRootView  = inflate();
    initView();
} 
return mRootView;

我在ViewPager中都是這樣使用的,可以試試看

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!