美文网首页
给软键盘加上一个插件布局

给软键盘加上一个插件布局

作者: _蘇芳_ | 来源:发表于2017-07-14 14:39 被阅读107次

思路:
放一个布局在页面底部,隐藏起来。当输入法弹起来的时候,检测到布局的变化,设置插件布局的显示即可

  1. AndroidManifest.xml里相应的Activity里加上android:windowSoftInputMode="stateHidden|adjustResize"
    至于为什么是adjustResize而不是adjustSpan,看图
    平时是这样
    normal.png
    adjustResize是这样
adjustResize.png
adjustPan是这样 adjustPan.png

区别:
EditText本来在背景的L处
adjustResize会把EditText顶到G处
adjustPan,EditText还是在L处,输入法把所有布局都顶起来了。
当然这俩还有一些别的区别,这不是本文讨论的重点。


上代码
布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:focusable="true"
                android:focusableInTouchMode="true">
    <EditText
        android:id="@+id/et"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:hint="XXXXXXXXXXXX"/>

    <TextView
        android:id="@+id/tv"
        android:layout_alignParentBottom="true"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColor="@android:color/white"
        android:textSize="20sp"
        android:background="@android:color/holo_green_light"
        android:text="bbbbbbbbbbbbbbbbbbbbbb"
        android:visibility="invisible"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="A\nB\nC\nD\nE\nD\nF\nG\nH\nI\nJ\nK\nL\nM\nN"
        android:textSize="60sp"/>
</RelativeLayout>

代码

public class MainActivity extends AppCompatActivity {
    private TextView mTv;
    private EditText mEt;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTv = (TextView) findViewById(R.id.tv);
        mEt = (EditText) findViewById(R.id.et);
        getWindow().getDecorView().getViewTreeObserver()
          .addOnGlobalLayoutListener(mLayoutChangeListener);
    }

    ViewTreeObserver.OnGlobalLayoutListener mLayoutChangeListener = new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            //判断窗口可见区域大小
            Rect r = new Rect();
            // getWindowVisibleDisplayFrame()会返回窗口的可见区域高度
            getWindow().getDecorView().getWindowVisibleDisplayFrame(r);
            int mScreenHeight = ScreenUtils.getScreenHeight();
            //如果屏幕高度和Window可见区域高度差值大于整个屏幕高度的1/3
            // 则表示软键盘显示中,否则软键盘为隐藏状态。
            int heightDifference = mScreenHeight - (r.bottom - r.top);
            boolean isKeyboardShowing = heightDifference > mScreenHeight / 3;
            if(isKeyboardShowing){
                          mTv.setVisibility(View.VISIBLE);
            }else{
                          mTv.setVisibility(View.INVISIBLE);
            }
        }
    };
}

为复用方便,拎了一个工具类出来

public class KeyBoardPluginUtils {

    /**
     * 这是全局的,用addOnGlobalLayoutListener,只要输入法弹起来就会触发
     * 清单里配置android:windowSoftInputMode="stateHidden|adjustResize"
     * */
    public static void addKeyBoardPluginGlobal(Activity activity,LinearLayout llPlugin) {
        activity.getWindow().getDecorView().getViewTreeObserver()
                .addOnGlobalLayoutListener(new GlobalLayoutListener(activity,llPlugin));
    }


    /**
     * 指定某个EditText会触发
     */
    public static void addKeyBoardPlugin(EditText et, final LinearLayout llPlugin) {
        et.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (hasFocus) {
                    llPlugin.setVisibility(View.VISIBLE);
                }else {
                    llPlugin.setVisibility(View.INVISIBLE);
                }
            }
        });

    }

    private static class GlobalLayoutListener implements ViewTreeObserver.OnGlobalLayoutListener {
        private Activity mActivity;
        private LinearLayout mLlPlugin;
        private GlobalLayoutListener(Activity activity, LinearLayout llPlugin) {
            mActivity = activity;
            mLlPlugin = llPlugin;
        }

        @Override
        public void onGlobalLayout() {
            //判断窗口可见区域大小
            Rect r = new Rect();
            // getWindowVisibleDisplayFrame()会返回窗口的可见区域高度
            mActivity.getWindow().getDecorView().getWindowVisibleDisplayFrame(r);
            int mScreenHeight = ScreenUtils.getScreenHeight();
            //如果屏幕高度和Window可见区域高度差值大于整个屏幕高度的1/3
            // 则表示软键盘显示中,否则软键盘为隐藏状态。
            int heightDifference = mScreenHeight - (r.bottom - r.top);
            boolean isKeyboardShowing = heightDifference > mScreenHeight / 3;
            if(isKeyboardShowing){
                mLlPlugin.setVisibility(View.VISIBLE);
            }else{
                mLlPlugin.setVisibility(View.INVISIBLE);
            }
        }
    }
}

相关文章

网友评论

      本文标题:给软键盘加上一个插件布局

      本文链接:https://www.haomeiwen.com/subject/djonhxtx.html