【问题标题】:Saving State of Fragment片段的保存状态
【发布时间】:2013-12-02 21:37:17
【问题描述】:

我有一个包含 5 个片段的 Activity(Form)。在我的第三个片段中,我有一个列表视图和一个图像按钮,用于从手机图库中获取图像并将其放入列表视图中。对于那件事我没有任何疑问。

此外,当我滑动到我的第二个和第四个片段并返回到我的第三个片段时,附加的图像会留在第三个片段列表视图中。

但是当我滑动到第 1 个和第 5 个片段并返回到我的第 3 个片段时,我的第 3 个片段列表视图上的图像附件消失了。可能是什么问题呢?这是我的代码:

片段3:

public class Fragment3 extends Fragment implements OnClickListener {

    ListView lv;
    ArrayList<Uri> array_list = new ArrayList<Uri>();
    ArrayAdapter<Uri> array_adapter;

    final int RQS_LOADIMAGE = 0;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View v = inflater.inflate(R.layout.frag3, container, false);

        ImageButton b = (ImageButton) v.findViewById(R.id.button_ai);
        b.setOnClickListener(this);

        array_adapter = new ArrayAdapter<Uri>(getActivity(), android.R.layout.simple_list_item_1, array_list);
        lv = (ListView) v.findViewById(R.id.list_ai);
        lv.setAdapter(array_adapter);

        return v;
    }

    @Override
    public void onClick(View arg0) {

        Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(intent, RQS_LOADIMAGE);
    }

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

      if (requestCode == RQS_LOADIMAGE) {

          if(resultCode == Form.RESULT_OK) {
            Uri imageUri = data.getData();
            array_list.add(imageUri);
            array_adapter.notifyDataSetChanged();
          }
      }
    }

}

ActivityForm:

public class Form extends FragmentActivity {

    ViewPager viewPager = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_form);

        viewPager = (ViewPager) findViewById(R.id.pager);
        FragmentManager fragmentManager = getSupportFragmentManager();
        viewPager.setAdapter(new MyAdapter(fragmentManager));

    }

    public class MyAdapter extends FragmentStatePagerAdapter {

        public MyAdapter (FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int i) {
            Fragment fragment = null;

            if (i == 0)
            {
                fragment = new Fragment1();
            }
            if (i == 1)
            {
                fragment = new Fragment2();
            }
            if (i == 2)
            {
                fragment = new Fragment3();
            }
            if (i == 3)
            {
                fragment = new Fragment4();
            }
            if (i == 4)
            {
                fragment = new Fragment5();
            }
            return fragment;
        }

        @Override
        public int getCount() {
            return 5;
        }
    }

}

【问题讨论】:

  • 我猜,代码没有问题。但是您需要在 backstack 中添加片段,以便获得片段 onBackPress 。 Here 就是一个例子。
  • 活动代码可以帮助我们告诉您该做什么。
  • 对不起。我现在已经发布了我的活动代码。

标签: android listview android-listview android-fragments


【解决方案1】:

View Pager默认只缓存左/当前/右3页。

您必须通过在代码中添加以下行来更改它:-

pager.setOffscreenPageLimit(5);  //in your case, you have 5 fragments 

【讨论】:

  • 谢谢。它现在正在保存我的片段状态:)
【解决方案2】:

Viepagers 仅缓存 3 个页面:当前页面、左侧页面和右侧页面。如果您的片段从该列表中掉下来,它将在稍后重新创建。使用FragmentStatePagerAdapter,这应该可以解决您的问题。

【讨论】:

  • 我现在已经发布了我的活动代码。我在我的活动中使用 FragmentStatePagerAdapter。
【解决方案3】:

您可以覆盖onSaveInstanceState(Bundle) 并将片段的状态保存在包中。同时覆盖onViewCreated(View, Bundle)。它会将您保存的数据放在包中,您可以使用它来恢复片段状态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多