我使用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;
}
}
答案 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);
}
}