Android ViewPager和EditText

时间:2014-01-10 16:01:36

标签: android android-fragments android-viewpager

我有一个带有三个标签的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();
}
}

1 个答案:

答案 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();
    }
}