2015-11-21 49 views
2

你好样的(机器人)的程序员,处理屏幕旋转的片段视图(州)PagerAdapter内内片段

的情况如下:

我有一个使用NavigationDrawer的活动,允许加载3个片段。在其中的一个片段中,我有一个ViewStatePagerAdapter,它将转而承载3个片段。在其中一个片段中,我使用cursorloader加载了一堆数据库。这些值可以编辑为一个新值,但在点击某个按钮之前不应将其保存到数据库。

所有这些工作正常,但问题是,当我现在旋转屏幕,所有更改的数据都消失了。我尝试在内部片段本身中使用onSaveInstance,但我认为问题在于更高,因为我已经注意到比旋转屏幕时ViewPager跳回第一个选项卡。

什么是正确的方式(/正确的位置:活动中,某些片段,...)来:

  1. 确保viewpager保持正确的选项卡
  2. 上记得在更改的数据内片段

包含viewpager目前该片段具有下列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内部已经按照预先的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; 
} 

感谢。

+0

后一些代码的东西。你的viewpager在创建什么?它是获取现有片段的一个实例,还是完全创建一个新的片段?什么是你的onCreate的片段。 – QuantumTiger

+0

@QuantumTiger 即将推出,已经添加了一个部分,也添加了更多。 – CounterFlame

+0

你在哪里重新加载savedinstancestate – QuantumTiger

回答

1

你可能已经知道了,但是这是什么样的,我会做解决您的第二个问题

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()); 
} 
+0

所以我做了这个,甚至把值发送到logcat,并在那里显示正确的值。在同样的if语句中,我使用setText,但在GUI中看不到它发生了变化。 我更新了现在在我的原始文章中使用的onCreateView,所以您可以看到。 – CounterFlame

+0

所以它看起来像被查看的片段是与写入logcat的片段不同的实例。上面Nguyen的回答有帮助吗? – QuantumTiger

+0

我想我修复了它,但我暂时删除了一些东西,所以一些错误可能会再次出现。 似乎问题是,在我的mainActivity中,我每次都做了一个新的HomeFragment,而不是首先检查是否存在一个(通过使用findFragmentByTag)。我想这让所有的孩子都消失了,包括ViewPager和那个里面的片段。 感谢您抽出时间帮助我,非常感谢。 – CounterFlame