Android软键盘与界面内容的坑

*******这是开发上个项目时遇到的有点问题,之前写过笔记,现在整理到博客上*********

1.遇到的问题

*用户注册页面,这个问题基本只要写过这个页面都会碰到,注册页面有多个EditText用来录入用户信息,够用情况下直接使用一个线性布局,其他属性不设置时呼出软键盘,系统会自动帮我们将页面内容往上推,使当前获取焦点的输入框刚好在软键盘上面。这个效果没有啥问题,但是!当你输入框很多,屏幕放不下时,把他们全部放入ScrollView,你就会发现底下的输入框获取焦点时并不会滚上来了。这时候你就需要关心软键盘输入模式了。

*项目中直播页面有聊天互动,如果聊天输入框获取焦点时再把内容区域顶出屏幕,那就没法看了,所以也需要调整软键盘输入模式。


2.关于软键盘输入模式的几个值

stateUnspecified-未指定状态:当我们没有设置android:windowSoftInputMode属性的时候,软件默认采用的就是这种交互方式,系统会根据界面采取相应的软键盘的显示模式。


stateUnchanged-不改变状态:当前界面的软键盘状态,取决于上一个界面的软键盘状态,无论是隐藏还是显示。


stateHidden-隐藏状态:当设置该状态时,软键盘总是被隐藏,不管是否有输入的需求。


stateAlwaysHidden-总是隐藏状态:当设置该状态时,软键盘总是被隐藏,和stateHidden不同的是,当我们跳转到下个界面,如果下个页面的软键盘是显示的,而我们再次回来的时候,软键盘就会隐藏起来。


stateVisible-可见状态:当设置为这个状态时,软键盘总是可见的,即使在界面上没有输入框的情况下也可以强制弹出来出来。


stateAlwaysVisible-总是显示状态:当设置为这个状态时,软键盘总是可见的,和stateVisible不同的是,当我们跳转到下个界面,如果下个页面软键盘是隐藏的,而我们再次回来的时候,软键盘就会显示出来。


adjustUnspecified-未指定模式:设置软键盘与软件的显示内容之间的显示关系。当你跟我们没有设置这个值的时候,这个选项也是默认的设置模式。在这中情况下,系统会根据界面选择不同的模式。


adjustResize-调整模式:该模式下窗口总是调整屏幕的大小用以保证软键盘的显示空间;这个选项不能和adjustPan同时使用,如果这两个属性都没有被设置,系统会根据窗口中的布局自动选择其中一个。


adjustPan-默认模式:该模式下不会通过调整屏幕大小来保证软键盘的空间,而是采取了另外一种策略,系统会通过布局的移动,来保证用户要进行输入的输入框肯定在用户的视野范围里面,从而让用户可以看到自己输入的内容。

可以单独设置一个值或是state值和adjust值组合,使用时在 manifest文件对应activity 声明属性 windowSoftInputMode 


3.解决问题

其实软键盘的本质就是一个Dialog,当我们点击输入框时,系统对活动主窗口进行调整,从而为软键盘腾出相应的空间,然后将该Dialog显示在底部。不设置时是由系统帮我们选取,遇到问题时我们就需要针对自己的情况强制指定了。

*第一个问题很好解决,直接设置Activity的 windowSoftInputMode为adjustPan 或者adjustResize 都可以使ScrollView滚动 输入框在软键盘之上,那么问题来了,这两种值设置有什么区别呢?adjustResize-调整模式:该模式下窗口总是调整屏幕的大小用以保证软键盘的显示空间,调整屏幕大小的意思就是说软键盘呼出以后,实际页面内容显示的区域只有键盘上面一部分了,就像问题中的,我的ScrollView被挤到了屏幕上半部分,简单说就是当前页面大小变小了,但是还能完整显示页面,与之对应的adjust模式中,页面大小没有被修改,只是被强制滑动,使输入框刚好滑动到了软键盘上方。这时候如果软键盘覆盖区域还有内容,你想要在键盘呼出状态下看到下面的内容是不行的。

*第二个问题,效果可以参考所有直播软件(我们这里分三个部分,1是VideoView,2是ViewPager做互动区域,3是输入框 )。根据上面的特性,页面布局上这三部分肯定是不能放在一个线性布局的,不然怎么调整软键盘都是徒劳。我们在相对布局中将VideoView和ViewPager作为内容区,EditText看做一部分,这时候默情况内容区域还是会被顶上去,adjustPan 模式时和默认一样,只有adjustResize模式下,EditText会被顶起且VideoView不会被移动,达到我们要的效果。那么我踩的坑在哪呢,我就是按照这个思路设置完以后死活不行,视频区域一直被滚动上去,在我回头对比了几个直播App之后发现原因就是这个:

 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
是的,我设置了全屏,导致软键盘设置模式失效!!!

-------关于全屏模式下adjustResize 失效问题 也已经有了解决方案,搜索 AndroidBug5497Workaround 

-------------------------------

第一篇博客,之前一直把东西记成笔记,简单方便,不用组织语言,自己看的懂就行,后来发现还是太天真,有些问题时间久了再看自己写的东西都一脸懵逼,到底还是不能偷懒,重要东西还是要做详细记录啊,以后会坚持写一些东西,以前的笔记,新学的知识什么的,希望自己能坚持下来。

你可能感兴趣的:(踩过的坑)