来自布局的Android片段-保留变量数据
我已经搜索了几个小时,尝试了许多方法,但似乎无法理解如何在ViewPager片段中保留/恢复数据(当数据被销毁然后重新创建时) 这是我的- 我在其中设置ViewPager和PageAdapter的活动来自布局的Android片段-保留变量数据,android,android-fragments,android-viewpager,Android,Android Fragments,Android Viewpager,我已经搜索了几个小时,尝试了许多方法,但似乎无法理解如何在ViewPager片段中保留/恢复数据(当数据被销毁然后重新创建时) 这是我的- 我在其中设置ViewPager和PageAdapter的活动 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.view_pager);
@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);
}
我的片段有一个布局,其中包括一个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等尝试了许多选项,但它们似乎都不起作用
我可以通过使用setOffscreenPageLimittotal页面保持所有ViewPager页面的活动状态来解决这个问题,但我已经读过这是一个坏主意,因为它占用了大量内存。我也使用PagerAdapter来支持一些静态选项卡小部件。我认为您需要向ScreenSlidePagerAdapter添加代码。谷歌网页在。 注意并阅读有关重写方法实例化项的详细信息。这是填充UI的地方。 PagerAdapter子类中ScreenSlidePagerAdapter的代码示例,使用您发布的代码:
@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);
}
实际上,对于这个框架中的视图,您负责保存UI元素的状态。例如,在我的ListView中,我正在缓存和保存多达100行的数据,并在适配器中刷新数据。对于缓存,我创建了包含UI数据的自定义类。以下是我使用的一个示例,可以帮助您保存图片URL的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 );
}
为什么设置args时加1,得到args时减1?我完全没有理由删除+1和-1。我刚才在处理序列中的第一个片段,必须添加+1来修复超出范围的错误,而没有意识到我仍然有-1。谢谢你指出这一点。你有ScreenSlidePagerAdapter.java的代码吗?这确实有效,我刚才玩过它,发誓没有。Android Studio也出了问题,不给我日志来查看问题的根源。谢谢你发布它,再试一次真的帮了我的忙!我发疯了,试图找出哪里出了问题,结果发现捆绑代码一直在按预期工作,我只是在错误的区域触发了更改。