gpt4 book ai didi

java - 处理 View(State)PagerAdapter 内 Fragment 内 Fragment 的屏幕旋转

转载 作者:行者123 更新时间:2023-11-30 10:53:53 25 4
gpt4 key购买 nike

你好善良的(android)程序员,

情况如下:

我有一个使用允许加载 3 个 fragment 的 NavigationDrawer 的 Activity 。在其中一个 fragment 中,我有一个 ViewStatePagerAdapter,它承载 3 个 fragment 。在其中一个 fragment 中,我使用游标加载器加载了一堆数据库数据。这些值可编辑为新值,但在单击某个按钮之前不应保存到数据库中。

一切正常,但问题是当我现在旋转屏幕时,所有更改的数据都消失了。我尝试在内部 fragment 本身中使用 onSaveInstance,但我认为问题更严重,正如我已经注意到的那样,而不是当我旋转屏幕时,viewpager 跳回到第一个选项卡。

什么是正确的方式(/正确的位置: Activity ,某些 fragment ,...):

  1. 确保 viewpager 保持在正确的选项卡上
  2. 记住内部 fragment 中改变的数据

包含 viewpager 的 fragment 当前有以下 onCreateView :

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

View v = inflater.inflate(R.layout.fragment_home, null);
tabLayout = (TabLayout) v.findViewById(R.id.fragment_tabs);
viewPager = (ViewPager) v.findViewById(R.id.fragment_viewpager);
viewPager.setOffscreenPageLimit(3);

viewPager.setAdapter(new MyAdapter(getChildFragmentManager()));
tabLayout.setupWithViewPager(viewPager);

return v;
}

和 FragmentStatePagerAdapter 的内部类

 class MyAdapter extends FragmentStatePagerAdapter {

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

/**
* Return fragment with respect to Position .
*/
@Override
public Fragment getItem(int position)
{
switch (position){
case 0 : return PersonFragment.newInstance();
case 1 : return FriendsFragment.newInstance();
case 2 : return EventsFragment.newInstance();
}
return null;
}

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

/**
* This method returns the title of the tab according to the position.
*/
@Override
public CharSequence getPageTitle(int position) {

switch (position){
case 0 :
return "ME";
case 1 :
return "FOLLOWING";
case 2 :
return "EVENTS";
}
return null;
}
}

这里的其他人没有什么特别的事情发生。 (哪个可能应该?)

viewpager 内部的 fragment 有以下 onCreate/onCreateView

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

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

View rootView = inflater.inflate(R.layout.fragment_person, container, false);
this.viewHolder = new ViewHolder(rootView);

if (savedInstanceState != null) {
CharSequence savedPersonName = savedInstanceState.getCharSequence("personName");
if (savedPersonName != null) {
Log.v("PersonFragment", savedPersonName.toString());
this.viewHolder.personnameView.setText(savedPersonName);
}
}

return rootView;
}

提前致谢。

最佳答案

您可能已经知道这一点,但这是我为解决您的第二个问题所做的事情

private TextView tvTitle;

public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.mylayout, container, false);

tvTitle = (TextView) rootView.findViewById(R.id.mytitle);

if (savedInstanceState != null) {
CharSequence csTitle = savedInstanceState.getCharSequence("myTitle");
if (csTitle != null) tvTitle.setText(csTitle);
}
}

public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);

outState.putCharSequence("myTitle", tvTitle.getText());
}

关于java - 处理 View(State)PagerAdapter 内 Fragment 内 Fragment 的屏幕旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33849676/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com