安卓前端研习——ViewPager常见问题及解决
使用到viewpager的时候常常会遇到一些奇怪的问题,下面是在做项目的时候遇到的viewpager与软键盘之间的问题。
打开软键盘时界面控件会被顶上去
出现的问题如图:

这个问题会导致控件的适配会变得很奇怪,但解决方法也是十分简单的,只需要在AndroidManifest文件中在使用到viewpager的activity中加入android:windowSoftInputMode="adjustPan"这句代码就可以解决的,完整代码例如:
<activity
android:name=".LoginActivity"
android:windowSoftInputMode="adjustPan">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
解决之后效果如下:
切换ViewPager界面后,软键盘不会自动收回
出现的问题如图:
解决这个问题我们需要找到viewpager的adapter的java文件,在其onPageSelected方法中监听输入法是否打开并对其执行相应操作。
首先要获取系统的输入法,代码如下:
private InputMethodManager manager;
manager = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
接着要在onPageSelected执行相关操作,具体代码如下:
currentFocus = Objects.requireNonNull(getActivity()).getCurrentFocus();
if(currentFocus != null){
//检查输入法是否打开
if(manager.isActive()){
//隐藏软键盘
try {
manager.hideSoftInputFromWindow(currentFocus.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
} catch (Exception e) {
e.printStackTrace();
}
}
}
完整代码如下:
private InputMethodManager manager;
private View currentFocus;
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
initPage(); //将页面添加进arrayList
initView(); //初始化viewpager,添加adapter
setListener(); //设置监听
manager = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
}
private ViewPager.OnPageChangeListener mOnPageChangeListener =
new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
menu_bar.getMenu().getItem(position).setChecked(true);
currentFocus = Objects.requireNonNull(getActivity()).getCurrentFocus();
if(currentFocus != null){
//检查输入法是否打开
if(manager.isActive()){
//隐藏软键盘
try {
manager.hideSoftInputFromWindow(currentFocus.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
};
解决后效果如图:


