Android 来自布局的片段 - 保留变量数据
Android Fragment from Layout - Retain variable data
我已经搜索了几个小时并尝试了很多方法,但似乎无法理解这个想法/弄清楚如何 retain/restore ViewPager Fragment 中的数据被销毁然后重新创建。
这是我的 -
我在其中设置 ViewPager 和 PageAdapteractivity
@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);
}
我的 Fragment 的布局包括一个向用户显示问题的 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);
}
});
我这辈子都想不通的是,如何 retain/save 用户按下按钮这一事实以及片段恢复时要显示的图片。我尝试了一些使用 onResume()、getArguments()、onSaveInstanceState()、onActivityCreated() 等的选项,但 none 似乎有效。
我可以通过使用 setOffscreenPageLimit(total pages) 使我所有的 ViewPager 页面保持活动状态来解决这个问题,但是我读到这是一个坏主意,因为它占用了大量内存。
我也使用过 PagerAdapter 来支持一些静态选项卡小部件。我认为您需要向 ScreenSlidePagerAdapter 添加代码。 Google 网页位于 PagerAdapter。
注意并阅读覆盖方法 instantiateItem 的详细信息。这是您填充 UI 的地方。
ScreenSlidePagerAdapterfrom (PagerAdapter subclass) 的代码示例,使用您发布的代码:
@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 数据的自定义 class。
这是我使用的一个示例,它可以帮助您保存图片 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 );
}
我已经搜索了几个小时并尝试了很多方法,但似乎无法理解这个想法/弄清楚如何 retain/restore ViewPager Fragment 中的数据被销毁然后重新创建。
这是我的 -
我在其中设置 ViewPager 和 PageAdapteractivity
@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);
}
我的 Fragment 的布局包括一个向用户显示问题的 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);
}
});
我这辈子都想不通的是,如何 retain/save 用户按下按钮这一事实以及片段恢复时要显示的图片。我尝试了一些使用 onResume()、getArguments()、onSaveInstanceState()、onActivityCreated() 等的选项,但 none 似乎有效。
我可以通过使用 setOffscreenPageLimit(total pages) 使我所有的 ViewPager 页面保持活动状态来解决这个问题,但是我读到这是一个坏主意,因为它占用了大量内存。
我也使用过 PagerAdapter 来支持一些静态选项卡小部件。我认为您需要向 ScreenSlidePagerAdapter 添加代码。 Google 网页位于 PagerAdapter。 注意并阅读覆盖方法 instantiateItem 的详细信息。这是您填充 UI 的地方。 ScreenSlidePagerAdapterfrom (PagerAdapter subclass) 的代码示例,使用您发布的代码:
@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 数据的自定义 class。
这是我使用的一个示例,它可以帮助您保存图片 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 );
}