我有一个带有三个标签的ViewPager。其中一个标签(实际上是片段)包含EditText
。
问题在于:当我滑动到该片段时(当它处于焦点时)我想显示键盘,当我滑动到下一个标签时,我想要隐藏键盘。问题是在ViewPager
中,片段仅在我滑动到第三个片段后被销毁,这意味着当没有EditText
的片段聚焦时键盘保持打开状态。另一个问题是,当我从第三个片段滑动到第二个片段(我重复一遍,没有EditText
控制)时,键盘显示因为ViewPager
实例化了一行中的两个片段。我希望我足够清楚,如果不是,我会尝试解释它。是否有某种方法可以在ViewPager
中实例化片段,只有当他聚焦时才能在聚焦时保存他的状态?感谢...
修改
这是我的适配器:
public class TabPagerAdapter extends FragmentPagerAdapter {
private List<Fragment> fragments;
public TabPagerAdapter(FragmentManager fm, List<Fragment> fragments) {
super(fm);
this.fragments = fragments;
}
@Override
public Fragment getItem(int position) {
return this.fragments.get(position);
}
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
super.setPrimaryItem(container, position, object);
fragments.get(position);
}
@Override
public int getCount() {
return this.fragments.size();
}
}
答案 0 :(得分:2)
是的,有。实际上,是否有某种方法可以在ViewPager中实例化片段,只有当它聚焦时才能在聚焦时保存状态?
PagerAdapter
有回调方法 - setPrimaryItem。根据文件:
调用以通知适配器当前哪个项目被视为“主要”,即向用户显示为当前页面。
它工作得非常好并且符合预期,我正在使用它一段时间,正是你所描述的原因 - 显示/隐藏相关页面的键盘..
关于保存状态 - 没有什么能阻止你从你想要的任何数据结构中保存对象数组,它们中的每一个都将保存表示适配器中特定位置的项目的字段。
修改强>
你应该像这样使用setPrimaryItem回调:
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
super.setPrimaryItem(container, position, object);
//assuming fragment in position 0 suppose to show keyboard, and others not.
if (position == 0) {
showKeyboardExplicitly();
} else {
hideKeyboardExplicitly();
}
}