安卓前端研习——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>

  解决之后效果如下:

[![2.gif](https://pic.iask.cn/fimg/657753653054.jpg)](https://pic.iask.cn/fimg/657753653054.jpg)

切换ViewPager界面后,软键盘不会自动收回

  出现的问题如图:

[![3.gif](https://pic.iask.cn/fimg/657433653053.jpg)](https://pic.iask.cn/fimg/657433653053.jpg)

  解决这个问题我们需要找到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) {

                }
            };

解决后效果如图:


初めて会ったの日から 僕の心の全てを奪った