@Override
public boolean dispatchTouchEvent(MotionEvent me) {
if (megetAction() ==MotionEventACTION_DOWN) {//把 *** 作放在用户点击的时候
View v = getCurrentFocus();//得到当前页面的焦点,ps:有输入框的页面焦点一般会被输入框占据
if (isShouldHideKeyboard(v, me)) {//判断用户点击的是否是输入框以外的区域
hideKeyboard(vgetWindowToken());//收起键盘
}
}
return superdispatchTouchEvent(me);
}
/
根据EditText所在坐标和用户点击的坐标相对比,来判断是否隐藏键盘,因为当用户点击EditText时则不能隐藏
@param v
@param event
@return
/
private boolean isShouldHideKeyboard(View v,MotionEvent event) {
if (v !=null && (vinstanceof EditText)) {//判断得到的焦点控件是否包含EditText
int[]l = {0,0};
vgetLocationInWindow(l);
int left =l[0],//得到输入框在屏幕中上下左右的位置
top =l[1],
bottom =top + vgetHeight(),
right =left + vgetWidth();
if (eventgetX() >left && eventgetX()
&& eventgetY() >top && eventgetY()
// 点击位置如果是EditText的区域,忽略它,不收起键盘。
return false;
}else {
return true;
}
}
// 如果焦点不是EditText则忽略
return false;
}
/
获取InputMethodManager,隐藏软键盘
@param token
/
private void hideKeyboard(IBinder token) {
if (token !=null) {
InputMethodManager im = (InputMethodManager) getSystemService(RealNameVerificationActivitythisINPUT_METHOD_SERVICE);
imhideSoftInputFromWindow(token,InputMethodManagerHIDE_NOT_ALWAYS);
}
}
在Android开发中,经常会有一个需求,做完某项 *** 作后,隐藏键盘,也即让Android中的软键盘不显示。今天,和大家分享如何利用代码来实现对Android的软件盘的隐藏、显示的 *** 作。
1、方法一(如果输入法在窗口上已经显示,则隐藏,反之则显示)
InputMethodManager imm = (InputMethodManager) getSystemService(ContextINPUT_METHOD_SERVICE);
immtoggleSoftInput(0, InputMethodManagerHIDE_NOT_ALWAYS);
2、方法二(view为接受软键盘输入的视图,SHOW_FORCED表示强制显示)
InputMethodManager imm = (InputMethodManager) getSystemService(ContextINPUT_METHOD_SERVICE);
immshowSoftInput(view,InputMethodManagerSHOW_FORCED);
immhideSoftInputFromWindow(viewgetWindowToken(), 0); //强制隐藏键盘
3、调用隐藏系统默认的输入法
((InputMethodManager)getSystemService(ContextINPUT_METHOD_SERVICE))hideSoftInputFromWindow
4、获取输入法打开的状态
InputMethodManager imm = (InputMethodManager)getSystemService(ContextINPUT_METHOD_SERVICE);
boolean isOpen=immisActive();//isOpen若返回true,则表示输入法打开
一、效果图:
二、Code:
/
1、获取main在窗体的可视区域
2、获取main在窗体的不可视区域高度
3、判断不可视区域高度,之前根据经验值,在有些手机上有点不大准,现改成屏幕整体高度的1/3
1、大于屏幕整体高度的1/3:键盘显示 获取Scroll的窗体坐标
算出main需要滚动的高度,使scroll显示。
2、小于屏幕整体高度的1/3:键盘隐藏
@param main 根布局
@param scroll 需要显示的最下方View
/
public static void addLayoutListener(final View main, final View scroll) {
maingetViewTreeObserver()addOnGlobalLayoutListener(new ViewTreeObserverOnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect rect = new Rect();
maingetWindowVisibleDisplayFrame(rect);
int screenHeight = maingetRootView()getHeight();
int mainInvisibleHeight = maingetRootView()getHeight() - rectbottom;
if (mainInvisibleHeight > screenHeight / 4) {
int[] location = new int[2];
scrollgetLocationInWindow(location);
int srollHeight = (location[1] + scrollgetHeight()) - rectbottom;
mainscrollTo(0, srollHeight);
} else {
mainscrollTo(0, 0);
}
}
});
}
三、调用方式:
在Activity的onCreate()中调用,
仅此记录。
原文链接:彻底搞定Android开发中软键盘的常见问题
软件盘的本质是什么?软键盘其实是一个Dialog。
InputMethodService为我们的输入法创建了一个Dialog,并且将该Dialog的Window的某些参数(如Gravity)进行了设置,使之能够在底部或者全屏显示。当我们点击输入框时,系统对活动主窗口进行调整,从而为输入法腾出相应的空间,然后将该Dialog显示在底部,或者全屏显示。
软键盘显示的调整
Android 定义了一个属性,名字为windowSoftInputMode, 这个属性用于设置Activity主窗口与软键盘的交互模式,用于避免软键盘遮挡内容的问题。我们可以在AndroidManifetxml中对Activity进行设置。如:android:windowSoftInputMode=”stateUnchanged|adjustPan”。 该属性可选的值有两部分,一部分为软键盘的状态控制,控制软键盘是隐藏还是显示,另一部分是Activity窗口的调整,以便腾出空间展示软键盘。 android:windowSoftInputMode的属性设置必须是下面中的一个值,或一个”state”值加一个”adjust”值的组合,各个值之间用 | 分开。
stateUnspecified-未指定状态 :当我们没有设置android:windowSoftInputMode属性的时候,软件默认采用的就是这种交互方式,系统会根据界面采取相应的软键盘的显示模式。
stateUnchanged-不改变状态 :当前界面的软键盘状态,取决于上一个界面的软键盘状态,无论是隐藏还是显示。
stateHidden-隐藏状态 :当设置该状态时,软键盘总是被隐藏,不管是否有输入的需求。
stateAlwaysHidden-总是隐藏状态 :当设置该状态时,软键盘总是被隐藏,和stateHidden不同的是,当我们跳转到下个界面,如果下个页面的软键盘是显示的,而我们再次回来的时候,软键盘就会隐藏起来。
stateVisible-可见状态 :当设置为这个状态时,软键盘总是可见的,即使在界面上没有输入框的情况下也可以强制d出来出来。
stateAlwaysVisible-总是显示状态 :当设置为这个状态时,软键盘总是可见的,和stateVisible不同的是,当我们跳转到下个界面,如果下个页面软键盘是隐藏的,而我们再次回来的时候,软键盘就会显示出来。
adjustUnspecified-未指定模式 :设置软键盘与软件的显示内容之间的显示关系。当你跟我们没有设置这个值的时候,这个选项也是默认的设置模式。在这中情况下,系统会根据界面选择不同的模式。
adjustResize-调整模式 :该模式下窗口总是调整屏幕的大小用以保证软键盘的显示空间;这个选项不能和adjustPan同时使用,如果这两个属性都没有被设置, 系统会根据窗口中的布局自动选择其中一个 。
adjustPan-默认模式 :该模式下通过不会调整来保证软键盘的空间,而是采取了另外一种策略,系统会通过布局的移动,来保证用户要进行输入的输入框肯定在用户的视野范围里面,从而让用户可以看到自己输入的内容。
案例
没有滚动布局xml
对于没有滚动控件的布局来说,adjustPan就是默认的设置,比如我们案例应用中的文本输入8,上面的文本输入框123和按钮都会被顶上去,且页面布局不可以滚动。
对于没有滚动控件的布局来说,整个布局会网上偏移(包括标题等)以保证输入框的可见。如果有滚动控件,那么就是内容网上偏移,标题不会动,还可以通关滚动来查看被顶上去的内容,而这点是不可滚动的布局所不具备的
有滚动布局xml
对于有滚动控件的布局,则是采用的adjustResize方式,比如我们案例应用中的文本输入8,上面的文本输入框123和按钮都会被顶上去, 可以通过滚动来查看被顶上去的内容。
根据这一原理,我们就可以把开发中遇到的软键盘遮挡页面的问题,利用ScrollView当做根布局,让系统采用adjustResize模式,很好地解决这一问题。
自动d出软键盘
有时候需要一进入Activity后就自动d出软键盘,可以通过设置一个时间函数来实现,具体写法如下:
方法一:
方法二:
有时进入Activity后不希望系统自动d出软键盘,我们可以按照下面的方法来实现:
方法一:
在AndroidMainfestxml中选择那个activity,设置windowSoftInputMode属性为adjustUnspecified|stateHidden
方法二:
让EditText失去焦点,使用EditText的clearFocus方法
方法三:
强制隐藏Android输入法窗口
方法四:
EditText始终不d出软件键盘
EditText设置ScrollView压缩背景解决办法
在你的Activity里加上
有时希望根据条件动态关闭软键盘,我们可以使用InputMethodManager类,按照下面的方法来实现:
方法一:
方法二:
强制隐藏软键盘,这个方法倒是很实用。
方法三:
方法四:
在onclick事件下以下方法可行(如果是EditText失去焦点/得到焦点,没有效果)
InputMethodManager的具体用法可以参考下面的链接: >
你好,解决办法如下所示:
首先,我们为布局代码新增一个" 添加数据 "的按钮。其中,要记得为线性布局设置一个orientation(方向),比如设置为vertical(垂直)。
然后,我们为按钮设置监听器,ContentValues对象提供了一个put方法来添加数据。put方法中有两个参数,第一个参数为数据库中对应的列名,第二个参数为相应的数据。添加完参数后,我们用SQLiteDatabase对象提供的insert方法把数据插入数据库。insert方法中有三个参数,第一个参数为表名;第二个参数用于在未添加数据的情况下,自动赋值为NULL,一般传入null即可;第三个参数为ContentValues对象的值。
如果我们还要传入一组数据,就要记得在传入数据之前,添加valuesclear()语句来把之前的数据清除掉。
SQL数据的一个主要原则是模式:数据库是如何组织的一个正式声明。模式被反映在你用于创建数据库的SQL语句中。你可能会发现,它有助于创建伴侣类,即约束(contract)类,这个类使用系统性的和自记录的方式来明确的指定你的模式的布局。约束(contract)类是一个定义URIs、表名和列名的常量容器。在相同包中的所有类都可以这个约束类中的常量。这样就会一处修改,全局有效。组织约束类的一个好方法是把定义放到类的根层次,以便它对整个数据库有效。
本文将一步一步讲解实现上述三种设计
获取键盘显示状态的原理是:首先利用getRootView()getHeight() 获取屏幕高度,在利用getWindowVisibleDisplayFrame 获取应用显示区域,但是这个区域不包含虚拟按键的区域(虚拟键盘、手机底部虚拟按键),我们根据前者与后者之差与状态栏高度的比较来判断键盘的显示与隐藏状态。
需要特别指出的是,在某些手机上,比如华为mate8,底部会出现一个可以随时隐藏与显示的一行虚拟按键(Android杂乱生态的无奈
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)