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

首先最近在一个类似于商城的应用!需要实现的功能就是像京东,淘宝类似的,点击一个类别出现类别中的商品!我遇到的问题就是如何保存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. 하나의 조각만 사용합니다. 그러면 매번 바꾸기 메서드를 호출할 필요가 없습니다. 페이지를 새로 고치려면 조각에 set 메서드를 제공한 다음 외부에서 호출하기만 하면 됩니다.

코드는 다음과 같습니다.
으아악

2. 활동이 재활용된 후 조각의 복구를 고려해야 합니다. 그리고 프래그먼트를 임시 변수에서 멤버 변수로 변경해야 합니다.

코드는 다음과 같습니다.
으아악

3. 질문자는 아마도 프래그먼트 안에 프래그먼트를 중첩하여 onCreateView 메서드를 복사했습니다. 특별한 FragmentManager를 사용해야 합니다.

코드는 다음과 같습니다.
으아악

또한 조각을 생성할 때 정적 팩토리 모드를 사용하는 것이 좋습니다. 조각 구성 방법에 매개변수를 추가하지 마세요. 이는 조각이 삭제된 후 복구하는 데 도움이 되지 않습니다. 동시에 현재 조각을 다른 조각에 전달하는 것은 권장되지 않습니다. 이렇게 하면 결합이 증가하고 조각의 유지 관리 및 재사용에 도움이 되지 않습니다. GoodsListFragment.java에 다음 메서드를 추가할 수 있습니다.

으아악
洪涛

transaction.replace를 사용하지 마세요. 이는 이전 조각을 교체하고 삭제하는 것입니다. 추가 및 숨기기를 사용하여 전환할 수 있습니다. 하지만 메모리가 오버플로되기 쉽습니다

Ty80

저는 강아지 목줄을 선택했어요!

PHPzhong

1. Activity에서 조각 만들기
2. 조각에 mRootView 멤버 변수를 추가합니다.
3. onCreateView에서:

으아악

저는 ViewPager에서 이런 방식으로 사용하고 있으니 한번 사용해 보세요

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿