最近刚做完公司一个项目,碰到几个小问题,自己在这里做点小笔记
项目中需求是要求沉侵式的效果,沉侵式的效果我就不多说了网上都有介绍,方法也有多种,但是可能会影响到其他的问题。这里我只能结合我项目中遇到的实际情况在这里说下。
当沉侵模式下,如果界面里面有类似评论那样的输入框就会造成输入框获得焦点之后,不被弹起被输入法挡住,或者是显示不全的效果。还有的在类似华为手机下面的虚拟按键的出现挡住下面的输入框,让你点都点不到编辑框的问题。
我这里的处理方式并不是单一的解决某一个问题是把三种情况下的问题同时解决。现在看到的图片是已经在沉浸模式下的效果,输入框被挡住了
我这里的沉浸模式的方法也是从网上找的两行代码在acitivity的
setContentView();后面加上就可以达到上面的效果。// 透明状态栏 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); //透明导航栏 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
这时候就要考虑怎么解决虚拟按键挡住界面的问题。后来经过网上找的代码这里也直接贴上来,在里面稍微改了点东西(把输入框顶起的高度和原文章的不一样,我之类的是没有顶起的时候是看不到下面顶起部分,原文中会看到一小段白色高度)
然后使用public class HightBottom { // For more information, see https://code.google.com/p/android/issues/detail?id=5497 // To use this class, simply invoke assistActivity() on an Activity that already has its content view set. // private static boolean isKeyBordVisiable; public static void assistActivity(View content) { new HightBottom(content); } private View mChildOfContent; private int usableHeightPrevious; private ViewGroup.LayoutParams frameLayoutParams; private HightBottom(View content) { mChildOfContent = content; mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { public void onGlobalLayout() { possiblyResizeChildOfContent(); } }); frameLayoutParams = mChildOfContent.getLayoutParams(); } private void possiblyResizeChildOfContent() { int usableHeightNow = computeUsableHeight(); if (usableHeightNow != usableHeightPrevious) { //如果两次高度不一致 // int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight(); // int heightDifference = usableHeightSansKeyboard - usableHeightNow; // if (heightDifference > (usableHeightSansKeyboard / 4)) { // // keyboard probably just became visible // isKeyBordVisiable=true; // } else { // // keyboard probably just became hidden // isKeyBordVisiable=false; // } //将计算的可视高度设置成视图的高度 frameLayoutParams.height = usableHeightNow; mChildOfContent.requestLayout();//请求重新布局 usableHeightPrevious = usableHeightNow; } } private int computeUsableHeight() { //计算视图可视高度 Rect r = new Rect(); mChildOfContent.getWindowVisibleDisplayFrame(r); // 这里是调整顶起的高度,可以直接用r.bottom return (r.bottom ); } }
HightBottom.assistActivity(findViewById(android.R.id.content)); 透明状态栏 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); //透明导航栏 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
现在看到输入框被顶起。
这里要提一点的是,将输入框顶起的方法网上说再activity的界面父界面里面加上属性android:fitssystemWindows="true",用这种方法的时候对你的沉浸式有会一定的影响,如果你的界面顶部和下面的其他空间颜色一样无所谓,但是如果是个渐变色的图片,就会有问题,实际上状态栏还是占高度的如下图
这样看起来并不能很好的达到沉浸模式,所以根据我自己的项目需求我还是用了第一种方法可能会更全面一点。但是这时候又碰到了另外一个问题,当输入框获得焦点之后可能会出现不被顶起或者顶起来的高度不对如下图。
这里可以看到输入框的下面一部分被挡住了。这是我们只需要在AndroidManifest里面对应的Activity里面添加属性
即可android:windowSoftInputMode="stateAlwaysHidden|adjustResize"
<activity android:name=".MainActivity" android:windowSoftInputMode="stateAlwaysHidden|adjustResize" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
最后当点击发送之后将输入框缩回
LinearLayout lin_comment = (LinearLayout) findViewById(R.id.lin_comment); et_comment = (EditText) findViewById(R.id.et_comment); lin_comment.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { InputMethodManager im = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); im.hideSoftInputFromWindow(et_comment.getWindowToken(), 0); } });