Android 模仿QQ登入分界面消除软键盘遮挡难点

作者:ca88编程

监听软键盘弹出及收起事件

在 AndroidManifest.xml 中相应的 Activity 设置 android:windowSoftInputMode="adjustResize",也可以在 java 代码中安装。

取得 ViewTreeObserver 并监听 OnGlobalLayoutListener, 当viewTree的布局发生变化时onGlobalLayout将会回调。我们新建二个KeyboardHelper补助类。

KeyboardHelper.java

public class KeyboardHelper { private Activity activity; private OnKeyboardStatusChangeListener onKeyboardStatusChangeListener; private int windowBottom = -1; private int keyboardHeight = 0; public KeyboardHelper(Activity activity) { this.activity = activity; activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); if (activity.getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) { activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } } public void onCreate() { View content = activity.findViewById(android.R.id.content); // content.addOnLayoutChangeListener; 这个方法有时会出现一些问题 content.getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener); } public void onDestroy() { View content = activity.findViewById(android.R.id.content); ViewUtils.removeOnGlobalLayoutListener(content, onGlobalLayoutListener); } private OnGlobalLayoutListener onGlobalLayoutListener = new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Rect rect = new Rect(); activity.getWindow().getDecorView().getWindowVisibleDisplayFrame; Log.d("KeyboardHelper", "onGlobalLayout: "   rect   ", "   windowBottom); int newBottom = rect.bottom; if (windowBottom != -1 && windowBottom != newBottom) { if (newBottom < windowBottom) { // keyboard pop keyboardHeight = windowBottom - newBottom; if (onKeyboardStatusChangeListener != null) { onKeyboardStatusChangeListener.onKeyboardPop(keyboardHeight); } } else { // keyboard close if (onKeyboardStatusChangeListener != null) { onKeyboardStatusChangeListener.onKeyboardClose(keyboardHeight); } } } windowBottom = newBottom; } }; public void setOnKeyboardStatusChangeListener( OnKeyboardStatusChangeListener onKeyboardStatusChangeListener) { this.onKeyboardStatusChangeListener = onKeyboardStatusChangeListener; } public interface OnKeyboardStatusChangeListener { void onKeyboardPop(int keyboardHeight); void onKeyboardClose(int keyboardHeight); }}

ViewUtils.java

public class ViewUtils { public static void removeOnGlobalLayoutListener(View view, ViewTreeObserver.OnGlobalLayoutListener onGlobalLayoutListener) { if (Build.VERSION.SDK_INT < 16) { view.getViewTreeObserver().removeGlobalOnLayoutListener(onGlobalLayoutListener); } else { view.getViewTreeObserver().removeOnGlobalLayoutListener(onGlobalLayoutListener); } }}

代码比较轻巧,无非是得到window的可视坐标,通过比较bottom的值来判别软键盘是弹出依旧收下。

ca88编程 1

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"> <EditTextandroid:id="@ id/et1"android:layout_width="match_parent"android:layout_height="50dp"android:text="文本输入框1" /> <Buttonandroid:id="@ id/btn1"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="5dp"android:text="猴子搬来的救兵按钮"android:textSize="15sp" /> <EditTextandroid:id="@ id/et2"android:layout_width="match_parent"android:layout_height="50dp"android:text="文本输入框2" /> <EditTextandroid:id="@ id/et3"android:layout_width="match_parent"android:layout_height="50dp"android:text="文本输入框3" /> <EditTextandroid:id="@ id/et4"android:layout_width="match_parent"android:layout_height="50dp"android:text="文本输入框4" /> <EditTextandroid:id="@ id/et5"android:layout_width="match_parent"android:layout_height="50dp"android:text="文本输入框5" /> <EditTextandroid:id="@ id/et6"android:layout_width="match_parent"android:layout_height="50dp"android:text="文本输入框6" /> <EditTextandroid:id="@ id/et7"android:layout_width="match_parent"android:layout_height="50dp"android:text="文本输入框7" /> <EditTextandroid:id="@ id/et8"android:layout_width="match_parent"android:layout_height="50dp"android:text="文本输入框8" /> <EditTextandroid:id="@ id/et9"android:layout_width="match_parent"android:layout_height="50dp"android:text="文本输入框9" /> <EditTextandroid:id="@ id/et10"android:layout_width="match_parent"android:layout_height="50dp"android:text="文本输入框10" /> <EditTextandroid:id="@ id/et11"android:layout_width="match_parent"android:layout_height="50dp"android:text="文本输入框11" /> <EditTextandroid:id="@ id/et12"android:layout_width="match_parent"android:layout_height="50dp"android:text="文本输入框12" /></LinearLayout>

前言            

        软键盘监听和EditText的显得难点,在我们的平时支出中基本是不可反败为胜的,当EditText地方靠分界面下方时,就供给思考软键盘和EditText的覆盖难点了。首先,谷歌自此至终,还并未有给我们提供第一手监听软件盘弹出和藏身的相关类和艺术,其次,软键盘弹出时,系统提供的Activity的windowSoftInputMode属性,并无法很好的消除项目其实须要,无论是adjustPan的窗口上移(顶端导航栏会被顶出窗口卡塔尔(قطر‎或然adjustResize的窗口截取(艾德itText会被遮挡一小部分,同时弹出和藏身时会有微小的闪亮卡塔尔国。所以,手动监听软键盘,并以此,依据每一种结构中EdiText所处的岗位来动态退换布局,才可以制止上述的不足。


QQ 登入界面很好的缓慢解决了软键盘遮挡难题,当然在大屏二哥大上软键盘并不会挡住登陆按键。后日咱们也来模拟三个QQ 登入分界面,最后效果如下:

缺点:譬如有此必要的Activity均须求获得到最外层控件和末段一个控件,监测键盘是还是不是弹出,再调用控件的scrollTo方法对分界面全体上移或是下移。代码冗余。


效果演示

不带设想键的手机效能,Gif里显示的可比快,实效相比慈善。

1-no_vir

带设想键的无绳电话机功用(虚构键的手提式有线电话机刚刚没办法用AS录屏,自带的录屏压缩Gif后居然是横着的,为了不歪脖子,只好上截屏,真机效果和上航海用体育场地是一律的)

2-vir1

2-vir2


落到实处 QQ 登陆分界面

有了这些 KeyBoardHelper,那么要落实和 QQ 登陆分界面雷同的机能就轻易了。大家竟然不要求其余自定义控件。思路是在软键盘弹出时,把登陆按键以上的构造往上移,只要为其安装三个负值的 topMargin 就能够。

如图所示:

ca88编程 2QQ登入分界面暗示图

MainActivity 代码如下:

public class MainActivity extends Activity { private int bottomHeight; private KeyboardHelper keyboardHelper; private View layoutBottom; private View layoutContent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_qq_login); layoutContent = findViewById(R.id.layout_content); layoutBottom = findViewById(R.id.layout_bottom); keyboardHelper = new KeyboardHelper; keyboardHelper.onCreate(); keyboardHelper.setOnKeyboardStatusChangeListener(onKeyBoardStatusChangeListener); layoutBottom.post(new Runnable() { @Override public void run() { bottomHeight = layoutBottom.getHeight; } private OnKeyboardStatusChangeListener onKeyBoardStatusChangeListener = new OnKeyboardStatusChangeListener() { @Override public void onKeyboardPop(int keyboardHeight) { final int height = keyboardHeight; if (bottomHeight > height) { layoutBottom.setVisibility(View.GONE); } else { int offset = bottomHeight - height; final ViewGroup.MarginLayoutParams lp = (MarginLayoutParams) layoutContent .getLayoutParams(); lp.topMargin = offset; layoutContent.setLayoutParams; } } @Override public void onKeyboardClose(int keyboardHeight) { if (View.VISIBLE != layoutBottom.getVisibility { layoutBottom.postDelayed(new Runnable() { @Override public void run() { layoutBottom.setVisibility(View.VISIBLE); } }, 300); } final ViewGroup.MarginLayoutParams lp = (MarginLayoutParams) layoutContent .getLayoutParams(); if (lp.topMargin != 0) { lp.topMargin = 0; layoutContent.setLayoutParams; } } }; @Override protected void onDestroy() { super.onDestroy(); keyboardHelper.onDestroy(); }}

布局文件:activity_qq_login.xml

<FrameLayout xmlns:andro xmlns:tools="http://schemas.android.com/tools" android: android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android: android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingTop="50dp"> <ImageView android: android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="18dp" android:contentDescription="marginTop68dp" android:scaleType="centerInside" android:src="@drawable/qq_ava" android:visibility="visible" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="18dp" android:background="#f3f0f0" android:paddingBottom="100dp" android:paddingLeft="10dp" android:paddingRight="10dp" android:paddingTop="100dp" android:text="这里为了演示增加一个TextView使登陆按钮在键盘底部" android:textColor="#333333" android:textSize="13sp" /> <LinearLayout android: android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#ffffff" android:divider="@drawable/divider" android:orientation="vertical" android:showDividers="middle"> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@null" android:hint="QQ号/手机号/邮箱" android:padding="10dp" android:textColor="#000000" android:textColorHint="#d2d2d2" android:textCursorDrawable="@null" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@null" android:hint="密码" android:padding="10dp" android:textColor="#000000" android:textColorHint="#d2d2d2" android:textCursorDrawable="@null" /> </LinearLayout> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="14dp" android:layout_marginRight="14dp" android:layout_marginTop="14dp" android:background="@drawable/btn_login" android:text="登陆" android:textSize="17sp" /> <RelativeLayout android: android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android: android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_margin="14dp" android:text="无法登陆?" android:textColor="@color/action_bar_bg" android:textSize="14sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:layout_margin="14dp" android:text="新用户" android:textColor="@color/action_bar_bg" android:textSize="14sp" /> </RelativeLayout> </LinearLayout> <include android: layout="@layout/appbar" android:layout_width="match_parent" android:layout_height="50dp" /></FrameLayout>

点自身下载源码

2、完结原理

对此还未有滚动控件的布局来说,adjustPan正是默许的装置,举个例子我们案例应用中的文本输入8,上边的文书输入框123和开关都会被顶上去,且页面结构无法滚动。

GitHub链接

软键盘监听和EditText展现德姆o-----------KeyBordDemo

优点:

1.足以确切监听键盘的弹出和隐蔽,UI和动作效果方面自由度相比较高。

2.足以确切的回调键盘弹出的莫斯科大学,不管是Activty照旧Fragment,手提式无线话机是或不是带设想键,

3.不需思索EditText的父构造是ScrollView,RelativeLayout或LinearLayout的出入的震慑而招致windowSoftInputMode属性失效的难题.

利用约束:

1.亟需设置沉浸式布局,所以最低供给Android 4.4及以上:

安装沉浸式布局后,Activity在安装android:windowSoftInputMode="adjustResize|stateHidden" 后,adjustResize的窗口截取效果就能够失效,大家要自个儿调控EditText的职分,所以要求动用这些特性。

2.Activity的大旨Theme必得世襲自系统宗旨中的.NoActionBar类别:                                                          带设想键的无绳电话机若不三番两遍该核心,会以致整个Activity分界面延伸至设想键中。


付出景况

JAVA1.8

Android Studio 3.0 Canary3

Gradle 4.0-milestone-1

使用

(1卡塔尔(قطر‎创立MainActivity 和 SecondActivity, 一个平放于SecondActivty的SecondFragment。

1-activity

(2卡塔尔MainActivity和SecondFragment的构造很简短,三个FrameLayout,包裹TextView和EditText,TextView至于最上部,用于测验软键盘弹出时,窗口是不是上移,EditText至于尾巴部分,用于测量检验软键盘回调的可观是不是确切和EditText调度高度时是还是不是留存闪烁。

2-layout

                                                                                                                                                                  (3卡塔尔(قطر‎在AndrodiManifest项目清单文件中,设置Application的theme 世襲自Theme.AppCompat.NoActionBar,同期设置MainActivity 和 SecondActivity的windowSoftInputMode="adjustResize|stateHidden"。

3-manifest

(4卡塔尔国在MainActivity 和 SecondActivity的 setContentView方法早前,做以下设置,使用沉浸式构造。

4-onCreate

(5卡塔尔国这么些艺术正是行使沉浸式构造后,重新苏醒设置最上端控件(比方日常app最上部都会设置自定义的导航栏State of Qatar的偏移量,使之呈现平常,建议接收paddingTop,特别轻便。

5-nav

(6卡塔尔(قطر‎接着,自定义叁个IKeyBoardListener接口来监听软键盘的弹出和潜伏,以致软键盘的弹出冲天。

6-listener

(7卡塔尔国然后,获取大家设置给Activity的根构造,譬如德姆o中的MainActivity正是其一FrameLayout,然后经过ViewTreeObserver.OnGlobalLayoutListener来监听跟布局,不打听ViewTreeObserver的能够查看有关小说,当软键盘弹出或隐瞒时,这一个监听器都会回调。

7-layout

(8State of Qatar大家须要计算出,系统的状态栏,导航栏,设想键的惊人 ,然后做以下总结:                                           int heightDiff=screenHeight- (r.bottom-r.top卡塔尔国;

heightDiff>navigationBarHeight statusBarHeight         软键盘弹出heightDiff<=navigationBarHeight statusBarHeight       软键盘隐敝            

即,显示器中度- Activity的可以看到边界的上下中度差(上面界r.top即状态栏的平底边界,上边际r.bottom即软键盘的最上部边界)> (系统状态栏高度 导航栏的万丈 虚拟键的万丈卡塔尔时,表达软键盘弹出了,弹出中度为:  heightDiff-状态栏中度-设想键的中度.

反过来讲,则注解软键盘隐讳了.         

8-count

 (9卡塔尔(قطر‎通过安装的IKeyBoardListener来回调键盘的弹出和隐藏,然后遵照visible和keyboardHeight来重置EditText布局的平底间距就能够,当然这里,也能够设置动漫,让EditText布局的抬起和滑降更自然。 

9-addListener

10-requestLayout

(10卡塔尔国在acitvity销毁时,记得消亡Activity根构造的监听。

11-removeListener


在读书本章在此之前,你应有驾驭 windowSoftInputMode 的局部质量,极度是 adjustResize,假诺还不熟练,提出先读书Android 软键盘之 windowSoftInputMode 深入分析再回过头来继续往下看。

注意点:adjustResize属性应当要分界面大小能够自己改换;

** 依据这一原理,大家就足以把开拓中境遇的软键盘遮挡页面包车型地铁难题,利用ScrollView当作根布局,让系统应用adjustResize格局,很好地覆灭这一难题。**

结语

            然则,笔者感觉下边包车型大巴消除措施可能存在一定劣点,五个是宽容性难题,低于4.4的话须要极度管理,另三个就是,假诺不想选取沉浸式布局,那么,近来尚未找到软键盘弹出时,让系统100%不对分界面做窗口上移和窗口截取的艺术,须要系统覆盖的意义一时候并不会起成效,而QQ和微信闲聊分界面,是相像四个内页滚动上海滑稽剧团的办法,但是用地点的点子,到达同等的效能并简单。当然,即使有越来越好的章程,能够享受一下,钟爱自个儿的稿子的话,给个赞吧。

Android 软件盘弹出恐怕会遮挡住分界面上的有些控件。当 windowSoftInputMode 为 adjustPan 时,平时不会蒙蔽 EditText,但是假设 EditText 上面是二个登陆按键,那么这些开关就或者被屏蔽,但有的时候我们期待客商输完密码能够一向点击登入按键,而不用把软键盘收起来。那个时候就要求用到 adjustResize,这种格局能够拿走到软键盘的莫斯中国科学技术大学学,那样大家即可正确的对分界面进行支配。

1).应用 adjustPan, 要是须求输入的项超多时,点击输入框,当前输入项会被顶到软键盘上方,但若当前输入框上面还会有输入项时,却须求先收起键盘,再点击相应的输入项工夫输入。那样操作太繁琐了,对于客商体验超级小好;

一、软键盘无法顶起页面

支付中有个须求是将页面尾巴部分的一个开关顶起,然则付出时意识Android5.0后头的版本设置了adjustResize属性后无法成功顶起。郁结了绵绵,最后在stackoverflow找到建设方案,这正是在根布局上助长fitsSystemWindow=”true”就能够。

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true">

此地写图片描述

那边的fitsSystemWindow具体的效果与利益便是您的**contentview是还是不是忽视actionbar,title,荧屏的最底层设想开关,将全体显示屏充当可用的空中。 **
平常状态,contentview可用的上空是去除了actionbar,title,尾部按钮的半空中后余下的可用区域;那一个特性设置为true,则忽视,false则不忽略

ca88编程 3QQ登陆分界面

ca88编程 4

Timer timer=new Timer(); 
timer.schedule(new TimerTask() {
    public void run() {
       InputMethodManager inputMethodManager=     (InputMethodManager)                    getSystemService(Context.INPUT_METHOD_SERVICE); 
       inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); 
} }, 1000); // 秒后自动弹出

大家再在那类的 AndroidMainfest.xml 中装置 windowSoftInputMode属性 为 adjustPan:

案例
并未滚动布局xml

上面前遇到地点二种情势开展自己检查自纠:

二、自定义软键盘开关成效失效

在edittext上步向Android:imeOptions=”actionSearch”那几个脾性没响应,最终发今后2.3及以上版本不起功用,应用方案:加上

    android:singleLine="true"

因为输入法键盘右下角暗中认可的回车键本来正是换行用的,当设置单行后,回车换行就错过成效了,那样就可以安装为寻找、发送、go等等。

方法四:

    Timer timer = new Timer();
    timer.schedule(new TimerTask() {
            public void run() {
            InputMethodManager inputManager =(InputMethodManager)             etInput.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
            inputManager.showSoftInput(etInput, 0);
            }},1000);// 1秒后自动弹出

透过下边包车型客车这种办法,经常构造输入键盘挡住输入框的难点主旨都能一蹴而就。即使界面全屏或是沉浸式状态栏情形。

InputMethodService为大家的输入法创制了二个Dialog,而且将该Dialog的Window的一些参数(如Gravity)进行了安装,使之能够在底层恐怕全屏呈现。当我们点击输入框时,系统对活动主窗口进行调节,进而为输入法腾出相应的半空中,然后将该Dialog展现在底层,或许全屏呈现。
软键盘展现的调动
Android概念了三个属性,名称叫windowSoftInputMode, 那天性情用于设置Activity主窗口与软键盘的相互形式,用于制止软键盘遮挡内容的主题材料。大家能够在AndroidManifet.xml中对Activity进行安装。如:android:windowSoftInputMode=”stateUnchanged|adjustPan”。 该属性可选的值有两局地,一部分为软键盘的情状调节,调节软键盘是逃匿依然显得,另一有个别是Activity窗口的调动,以便腾出空间显得软键盘。 android:windowSoftInputMode的品质设置务必是底下中的一个值,或一个”state”值加一个”adjust”值的构成,各样值之间用 | 分开。
stateUnspecified-未钦点状态:当大家尚无设置android:windowSoftInputMode属性的时候,软件暗中同意使用的便是这种人机联作格局,系统会基于分界面采用对应的软键盘的显示方式。
stateUnchanged-不修正状态:当前界面包车型客车软键盘状态,决意于上叁个分界面包车型大巴软键盘状态,无论是隐敝如故彰显。
stateHidden-隐蔽状态:当设置该情形时,软键盘总是被埋伏,不管是否有输入的急需。
stateAlwaysHidden-总是暗藏状态:当设置这一场合时,软键盘总是被隐形,和stateHidden分歧的是,当我们跳转到下个分界面,假若下个页面包车型大巴软键盘是呈现的,而笔者辈重回的时候,软键盘就能够暗藏起来。
stateVisible-可知状态:当设置为那几个情形时,软键盘总是可以知道的,即便在分界面上并未输入框的图景下也得以逼迫弹出来出来。
stateAlwaysVisible-总是显得状态:当设置为这么些情景时,软键盘总是可以看到的,和stateVisible差别的是,当大家跳转到下个分界面,借使下个页面软键盘是暗藏的,而作者辈再次再次来到的时候,软键盘就能够突显出来。
adjustUnspecified-未钦点方式:设置软键盘与软件的来得内容之间的展示关系。当你跟大家尚无设置那几个值的时候,这么些选项也是暗许的装置形式。在这里中状态下,系统会依照分界面接受不一样的形式。
adjustResize-调解情势:该形式下窗口总是调度显示器的深浅用以保险软键盘的展示空间;那一个选项无法和adjustPan同期利用,假使那四个特性都未有被安装,系统会基于窗口中的布局自动选用中间二个
adjustPan-暗许情势:该形式下通过不会调度来确定保障软键盘的空中,而是选择了其余一种政策,系统会经过布局的位移,来确定保证客商要拓宽输入的输入框分明在顾客的视界范围里边,进而让客商能够见到自身输入的内容。

优点:应用简易,只需在Activity的最外层构造包裹贰个ScrollView就可以。

初藳链接:彻底解决Android开辟中国Computer软件与手艺服务总公司键盘的管见所及难点
软件盘的真相是何等?软键盘其实是多少个Dialog。

3、ScrollView adjustResize

方法二:

ca88编程,艺术四:监听Activity顶层View,推断软键盘是还是不是弹起,对分界面重新绘制

不活动掸出软键盘

临时步入Activity后不希望系统活动掸出软键盘,我们得以依据上面包车型地铁秘诀来贯彻:
方法一:
在AndroidMainfest.xml中采取极其activity,设置windowSoftInputMode属性为adjustUnspecified|stateHidden

    <activity Android:name=".Main" 
      Android:label="@string/app_name" 
      Android:windowSoftInputMode="adjustUnspecified|stateHidden" 
      Android:configChanges="orientation|keyboardHidden"> 
      <intent-filter> 
          <action Android:name="android.intent.action.MAIN" /> 
          <category Android:name="android.intent.category.LAUNCHER" />
       </intent-filter>
    </activity>

方法二:
让EditText失去大旨,使用EditText的clearFocus方法

    EditText edit=(EditText)findViewById(R.id.edit); 
    edit.clearFocus();

方法三:
免强蒙蔽Android输入法窗口

    EditText edit=(EditText)findViewById(R.id.edit);      
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
     imm.hideSoftInputFromWindow(edit.getWindowToken(),0);

方法四:
EditText始终不弹出软件键盘

    EditText edit=(EditText)findViewById(R.id.edit);       
    edit.setInputType(InputType.TYPE_NULL);

EditText设置ScrollView压缩背景图片解决办法
在你的Activity里加上

 getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

方法二:

动态关闭软键盘

一时希望依据标准动态关闭软键盘,大家能够利用InputMethodManager类,遵照上面包车型地铁艺术来落到实处:
方法一:

    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); //得到InputMethodManager的实例
    if (imm.isActive()) {//如果开启 
        //关闭软键盘,开启方法相同,这个方法是切换开启与关闭状态的
        imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT,InputMethodManager.HIDE_NOT_ALWAYS);
    }
    //这个方法实际是软键盘的开关方法,调用一次打开软键盘再调用一次关闭软键盘,实际上可能并没有那么使用

方法二:
免强掩没软键盘,这一个法子倒是很实用。

    public void KeyBoardCancle() { 
    View view = getWindow().peekDecorView(); 
    if (view != null) { 
            InputMethodManager inputmanger = (InputMethodManager)  getSystemService(ActivityBase.INPUT_METHOD_SERVICE); 
            inputmanger.hideSoftInputFromWindow(view.getWindowToken(), 0); 
    } }

方法三:

    int flags = WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; 
    getWindow().addFlags(flags); 

方法四:

在onclick事件下.以下方式可行.(如果是EditText失去核心/得到难题,未有效应卡塔尔

    InputMethodManager im = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
    im.hideSoftInputFromWindow(getCurrentFocus().getApplicationWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

InputMethodManager的现实用法能够参照他事他说加以调查上面包车型大巴链接: http://www.apihome.cn/api/android/InputMethodManager.html

(2).给我们的 Activity 的xml布局View设置多个 Listener 监听:

  <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"> <LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"> <EditTextandroid:id="@ id/et1"android:layout_width="match_parent"android:layout_height="50dp"android:text="文本输入框1" /> <Buttonandroid:id="@ id/btn1"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="5dp"android:text="猴子搬来的救兵按钮"android:textSize="15sp" /> <EditTextandroid:id="@ id/et2"android:layout_width="match_parent"android:layout_height="50dp"android:text="文本输入框2" /> <EditTextandroid:id="@ id/et3"android:layout_width="match_parent"android:layout_height="50dp"android:text="文本输入框3" /> <EditTextandroid:id="@ id/et4"android:layout_width="match_parent"android:layout_height="50dp"android:text="文本输入框4" /> <EditTextandroid:id="@ id/et5"android:layout_width="match_parent"android:layout_height="50dp"android:text="文本输入框5" /> <EditTextandroid:id="@ id/et6"android:layout_width="match_parent"android:layout_height="50dp"android:text="文本输入框6" /> <EditTextandroid:id="@ id/et7"android:layout_width="match_parent"android:layout_height="50dp"android:text="文本输入框7" /> <EditTextandroid:id="@ id/et8"android:layout_width="match_parent"android:layout_height="50dp"android:text="文本输入框8" /> <EditTextandroid:id="@ id/et9"android:layout_width="match_parent"android:layout_height="50dp"android:text="文本输入框9" /> <EditTextandroid:id="@ id/et10"android:layout_width="match_parent"android:layout_height="50dp"android:text="文本输入框10" /> <EditTextandroid:id="@ id/et11"android:layout_width="match_parent"android:layout_height="50dp"android:text="文本输入框11" /> <EditTextandroid:id="@ id/et12"android:layout_width="match_parent"android:layout_height="50dp"android:text="文本输入框12" /> </LinearLayout> </ScrollView>

RelativeLayoutmain=(RelativeLayout) findViewById(R.id.main);

从没有过滚动的布局

潇潇凤儿的博客地址:


ca88编程 5

机动弹出软键盘
一时须要一进来Activity后就机关弹出软键盘,能够透过安装叁个日子函数来兑现,具体写法如下:
方法一:

此办法的贯彻来源android中建议的issue 5497

对于有滚动控件的结构,则是运用的adjustResize方式,比方大家案例应用中的文本输入8,上边的文书输入框123和按键都会被顶上去,能够由此滚动来查阅被顶上去的从头到尾的经过。

它的兑现原理首假诺:

踩过的坑

一、达成步骤

对此未有滚动控件的架构来讲,整个结构会英特网偏移(满含标题等)以作保输入框的可以知道。假如有滚动控件,那么正是内容网络偏移,标题不会动,还足以过得去滚动来查阅被顶上去的内容,而这一点是不行滚动的布局所不富有的

在相应界面包车型客车xml构造中,最外层增加叁个 ScrollView,不在 AndroidMainfest.xml 中安装任何 android:windowSoftInputMode属性,那时候点击输入框,输入框均不会被软键盘档住。纵然当前输入框下方也可能有输入框,在键盘展现的情景下,也能够由此上下滑动分界面来输入,而不用先隐敝键盘,点击下方输入框,再展现键盘输入。

有滚动布局xml

2卡塔尔国 要是对于非全屏/非沉浸式状态栏要求,只供给采纳方法二就可以;

软键盘分界面开关功效设置形式

应用android:imeOptinos可对Android自带的软键盘实香港行政局地分界面上的设置:

    <EditText android:id="@ id/text1" android:layout_width="150dip" android:layout_height="wrap_content" 
    android:imeOptions="flagNoExtractUi"/> 

android:imeOptions="flagNoExtractUi" //使软键盘不全屏呈现,仅占用部分荧屏

再者,那个性格还是能够控件软键盘右下角按钮的显示内容,暗许意况下为回车键
android:imeOptions="actionNone" //输入框左边不带其余提醒android:imeOptions="actionGo" //右下角开关内容为'开端' android:imeOptions="actionSearch" //右下角按钮为突镜图片,寻找android:imeOptions="actionSend" //右下角开关内容为'发送' android:imeOptions="actionNext" //右下角按钮内容为'下一步' android:imeOptions="actionDone" //右下角开关内容为'完成'

这边写图片描述

此处写图片描述

同期,大概EditText增多相应的监听器,捕捉顾客点击了软键盘右下角开关的监听事件,以便进行拍卖。

    editText.setOnEditorActionListener(new   OnEditorActionListener() { 
            @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                 Toast.makeText(MainActivity.this, "响应了配置后的按键", Toast.LENGTH_SHORT).show(); return false;
             } 
    });

1).当 Activity 设置成全屏 fullscreen 方式时大概使用沉浸式状态栏时,分界面最外层包裹  ScrollView,当输入框抢先一屏,当前输入框上面的输入框并不可能左右滑动来输入,景况好像于 ScrollView adjustPan,只好滑动部分,通过 Inspect Layout 也得以看出,分界面可用中度是全部显示屏高度,并不会开展调度高度。就算设置 adjustResize,也不起效能。


adjustResize失效意况:activity 设置了全屏属性指 Theme.Light.NotittleBar.Fullscreen 恐怕设置了 activity 对应的宗旨中 android:windowTranslucentStatus 属性,设置形式为:android:windowTranslucentStatus=true,那个时候假若对应的页面上含蓄输入框,将会引致点击输入框时软键盘弹出后键盘覆盖输入框,以致输入框看不见。

ca88编程 6

大家得以依靠 Android Studio 的 Inspect Layout 工具来查阅分界面真正攻克的构造高度,工具在:

android:fitsSystemWindows=“true”会使得显示器上的可构造空间坐落于状态栏下方与导航栏上方。

选拔情状:针对分界面全屏或是沉浸式状态栏,分界面富含超级多输入框,分界面就算包裹了一层 ScrollView,在键盘彰显时,当前输入框上面包车型地铁输入不能够经过上下滑动分界面来输入。

本文由ca88发布,转载请注明来源

关键词: Android知识 Andr 界面 遮挡 键盘