繁体   English   中英

来自布局的Android片段 - 保留可变数据

[英]Android Fragment from Layout - Retain variable data

我一直在寻找好几个小时并尝试了很多方法,但似乎无法理解这个想法/弄清楚如何在ViewPager Fragment中销毁并恢复数据时保留/恢复数据。

这是我的 -

一个活动 ,我设置了ViewPager和PageAdapter

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

    //Setup pager and adapter
    mPager = (ViewPager) findViewById(R.id.viewpager);
    mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
    mPager.setAdapter(mPagerAdapter);
}

我的PageAdapter ,我使用.newInstance()设置一个包含片段的片段

@Override
public Fragment getItem(int position) {
    ScreenSlidePageFragment fragment = new ScreenSlidePageFragment();
    return fragment.newInstance(position);
}

My Fragment具有包含TextView的布局,该TextView向用户显示问题,图片和两个True / False按钮。 新实例将返回到适配器。

public static ScreenSlidePageFragment newInstance(int position) {
    ScreenSlidePageFragment fragment = new ScreenSlidePageFragment();
    Bundle args = new Bundle();
    args.putInt("page_position", position + 1);
    fragment.setArguments(args);
    return fragment;
}

//the fragment is newly created for the first time or recreated when exiting the view
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_main, parent, false);

    //Handle a question being displayed on each fragment
    count = getArguments().getInt("page_position") - 1;
    mQuestionText = (TextView)v.findViewById(R.id.questionText);
    mQuestionText.setText(bank.get(count).getQuestion());

    //change the image depending on correct / incorrect answer
    mPhoto = (ImageView)v.findViewById(R.id.imageView);
    trueButton = (Button)v.findViewById(R.id.true_button);
    falseButton = (Button)v.findViewById(R.id.false_button);

    //True Button is pressed
    trueButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            if(bank.get(count).getAnswer()) {
                mPhoto.setImageResource(R.drawable.right);
                clickable = false;
            }
            else {
                mPhoto.setImageResource(R.drawable.wrong);
                clickable = false;
            }
            trueButton.setClickable(clickable);
            falseButton.setClickable(clickable);
        }
    });

对于我的生活,我无法弄清楚的是,如何保留/保存用户按下按钮以及在片段恢复时显示哪个图片的事实。 我已经使用onResume(),getArguments(),onSaveInstanceState(),onActivityCreated()等尝试了许多选项,但它们似乎都没有用。

我可以通过使用setOffscreenPageLimit(总页数)保持我的所有ViewPager页面都处于活动状态来解决问题,但是已经读过这是一个坏主意,因为它占用了大量内存。

我也使用PagerAdapter来支持几个静态选项卡小部件。 我认为您需要向ScreenSlidePagerAdapter添加代码。 PagerAdapter的 Google网页。 请注意并阅读覆盖方法instantiateItem的详细信息。 这是您填充UI的位置。 ScreenSlidePagerAdapterfrom(PagerAdapter子类)的代码示例,使用您发布的代码:

@Override
public Object instantiateItem(ViewGroup container, int position) {
    View v = inflater.inflate(R.layout.fragment_main, parent, false);
...
    trueButton = (Button)v.findViewById(R.id.true_button);
}

实际上,在此框架中使用Views,您负责保存UI元素的状态。 在我的ListView中,我正在缓存并保存多达100行数据,并在适配器中刷新它,例如。 对于缓存,我创建了包含UI数据的自定义类。

下面是我使用的一个示例,它可以帮助您保存图片网址的ArrayList,以便稍后重新创建视图时,您需要覆盖onSavedInstanceState并将变量保存在一个包中,然后从包中检索值。视图再次创建,希望这可以帮助

ArrayList<String> picutersUrl = new ArrayList<String>();

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

        if(savedInstanceState!=null)
        {
          picutersUrl = savedInstanceState.getStringArrayList("My Pictures");
        }


      @Override
      protected void onSaveInstanceState(Bundle bundle) 
      {
        super.onSaveInstanceState(bundle);
        bundle.putStringArrayList("My Pictures", picutersUrl   );
      }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM