PageViewer:如何获取相邻页面的类?

时间:2015-05-17 09:17:34

标签: android android-fragments android-viewpager android-animation

我使用PageViewer滚动两种类型的片段。 其中一个具有EditText和其他多个按钮。 进入EditText片段后,我会自动打开软键盘。进入Button Fragment后我关闭它。 这很好用。 问题是我有多个EditText片段作为彼此的直接邻居。 - >我不希望在从一个EditText片段转换到下一个EditText片段时关闭键盘。 为此,我需要预测我接下来要转换的类。

有没有办法实现这个目标?

注意:一旦滑动移动,我就会在pageTransform方法中关闭键盘。

EDIT 因为我的PagerAdapter在评论中有一个请求:

public class ButtonCollectionPagerAdapter extends FragmentStatePagerAdapter {
    public ButtonCollectionPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    private Fragment currentFragment;

    @Override
    public Fragment getItem(int i) {

        Bundle args = new Bundle();
        List<MultipleChoiceQuestion> multipleChoiceQuestions = QuestionTexts.getMCQuestionTexts();
        List<String> questionTexts = QuestionTexts.getQuestionTexts();

       if(i < multipleChoiceQuestions.size()){
           String question = multipleChoiceQuestions.get(i).getText();
           ArrayList<String> choices = (ArrayList<String>) multipleChoiceQuestions.get(i).getChoices();
           currentFragment = ButtonFragment.newInstance(question, choices, i);
       } else if(i < (multipleChoiceQuestions.size() + questionTexts.size())){
            currentFragment = TextViewFragment.newInstance(questionTexts.get(i - multipleChoiceQuestions.size()), i);
       } else {
            currentFragment = SendFragment.newInstance(i);
       }
       return currentFragment;
    }

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

   @Override
   public CharSequence getPageTitle(int position) {
      return "OBJECT " + (position + 1);
   }

   @Override
   public void setPrimaryItem(ViewGroup container, int position, Object object){
       super.setPrimaryItem(container, position, object);
       currentFragment = (Fragment) object;
       ((PagerAdapterUpdateProgress) object).onGettingPrimary(position);
   }

   public Fragment getCurrentFragment() {
      return currentFragment;
   }

}

2 个答案:

答案 0 :(得分:0)

我认为更简单的方法是直接从片段中打开/关闭键盘。您可以通过覆盖片段的setUserVisibleHint方法来确定片段何时可​​见。 EditText片段的此方法中的代码应该只显示键盘,其他片段的代码应该隐藏键盘。

答案 1 :(得分:0)

这是一个有趣的问题。

我相信你可以通过使用ViewPager.OnPageChangeListener监听器,尤其是onPageSelected(int position)方法来实现你正在做的事情,在这种方法中我们可以在滑动动画完成后获得当前所选片段的位置。

mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

    }

    @Override
    public void onPageSelected(int position) {
       Log.d("ViewPager", "Page selected " + position);
       onPageSelectedLogic(position);
    }

    @Override
    public void onPageScrollStateChanged(int state) {

    }
});
// This is because the first fragment doesn't fire the OnPageChangeListener.
onPageSelectedLogic(0);

这是onPageSelectedLogic方法

的实现
private void onPageSelectedLogic(int position) {
   // Check the type of the fragment editable vs button
   if(!mPagerAdpater.isFragmentEdiatable(position)) {
      // Close the Keyboard
   }
}

这就是您应该如何实施PagerAdapter

class CustomPagerAdapter extends FragmentStatePagerAdapter {
        private SparseBooleanArray fragmentsEditable = new SparseBooleanArray();

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

        @Override
        public Fragment getItem(int position) {
            Fragment fargment;
            // get the fragment
            if(some condition) {
               // Get an editable fragment
               fragmentsEditable.put(position, true);
            } else {
               fragmentsEditable.put(position, false);
            }

            return fragment;
        }

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

        public boolean isFragmentEditable(int postion) {
            return fragmentsEditable.get(postion);
        }
    }