最近项目有一个比较苦B的需求,需要在用户输入内容之前,弹出推赞窗口,以让用户可以从中选择一些系统推荐的内容。这个需求通过拦截焦点,可以搞掂软键盘和推荐弹窗的冲突。但是更苦B的是,输入控件设计在屏幕的最下面(Bottom),这个导致了一个十分怪异的现象:
默认下输入控件是没有焦点的,当用户点击时,系统软键盘会自动优先弹出。因为有推荐功能,我们要先让用户看到推荐弹出窗。那就要把原来弹出的软件人为地隐藏,再弹出推荐窗,问题就出在这个环节上。
由于软件盘得隐藏有一定的时间,弹窗定苗就定在输入控件原来的位置(就是被软键盘推高的位置),软键盘隐藏后,弹窗就出现在屏幕的中部,但是输入控件已经回落到底部了!
解析问题之前,我们先了解一下,软键盘弹出的方式:
在AndroidManifest.xml文件中的Activity标签的属性中,可以找到android:windowSoftInputMode,其各个值的意义见下:
【A】stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
【B】stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
【C】stateHidden:用户选择activity时,软键盘总是被隐藏
【D】stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
【E】stateVisible:软键盘通常是可见的
【F】stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
【G】adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
【H】adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
【I】adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分
我设置的就是stateHidden|adjustResize,所以软键盘会托起activity的UI,隐藏的时候,UI重画,那当然就是耗费一点时间了。
既然知道问题,那解决方案就有了:监听Activity重画的状态,当Activity重画完才弹出推荐窗。
思路和简单,实现也不复杂,Activity重画,必定会回调某些内部的函数,我们只要重写那些函数,再发通知出来就可以了。
Activity的主要布局是RelativeLayout,由于属性设的是adjustResize,当软键盘隐藏时,会调用RelativeLayout的onSizeChanged方法,我们就从这里入手:
public class ResizeLayout extends RelativeLayout {
public ResizeLayout(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public ResizeLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
public ResizeLayout(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public void setOnResizeListener(OnResizeListener l) {
mListener = l;
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
if (mListener != null) {
mListener.OnResize(w, h, oldw, oldh);
}
}
private OnResizeListener mListener;
public interface OnResizeListener {
void OnResize(int w, int h, int oldw, int oldh);
};
}
我们重写onSizeChanged方法,并为自定义的layout定义一个回调接口,其实现的子类只要实现该接口,当使用此layout的Activity在软键盘隐藏时,就会通知到实现的子类了!
分享到:
相关推荐
当软键盘弹出时,由于屏幕可用空间减少,根布局的高度会相应减小;而当软键盘收起时,根布局的高度则会恢复。可以通过重写onGlobalLayout()方法并使用ViewTreeObserver来监听布局的变化: ```java rootView....
还可以创建一个BroadcastReceiver来监听系统的输入设备状态变化,当键盘弹出或收起时,系统会发送相应的广播。不过,这种方法需要声明权限,并且在Android 8.0及以上版本可能会失效。 ```java public class ...
当软键盘弹出时,由于屏幕空间被占用,Activity的根布局高度会减少。我们可以监听OnGlobalLayoutListener,对比前后布局的高度变化来判断软键盘的状态。以下是一个简单的示例: ```java final View ...
代码来源: 从facebook React源码ReactRootView中抽离CustomGlobalLayoutListener,用于监听Android系统软键盘的弹出与关闭。 ...软键盘弹出和关闭时,可同时回调 keyboardHeight 软键盘的高度值。
if (heightDiff > dpToPx(context, 200)) { // 如果高度差超过200dp,假设软键盘弹出 // 软键盘弹出的处理逻辑 } else { // 软键盘隐藏的处理逻辑 } } }); // dp转px的辅助方法 public static float dpToPx...
这个接口可以在View树全局布局改变时被调用,例如当软键盘弹出或隐藏时。以下是一个简单的示例: ```java final View activityRootView = findViewById(R.id.activity_root_view); activityRootView....
当软键盘弹出时,Android系统的`Activity`会接收到一个`onWindowFocusChanged()`回调,其中的参数`hasFocus`表示当前`Activity`是否拥有焦点。软键盘弹出时,焦点通常会转移至输入框,导致`hasFocus`为`false`;而...
当软键盘弹出时,布局的高度会减少,因此可以通过比较布局高度变化来判断: ```java View rootView = findViewById(android.R.id.content); rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ...
设置为`adjustResize|stateAlwaysHidden`可以让应用在软键盘弹出时自动调整布局大小。当键盘弹出时,Activity的布局会相应缩小,以便为键盘腾出空间。为了监听这种布局变化,我们可以让Activity实现`...
Android系统在软键盘弹出或隐藏时会触发Activity的布局过程,我们可以通过监听这个过程来判断软键盘的状态。描述中提到的方法是通过重写`onLayout`方法来实现这一功能。 `onLayout`方法是View类的一个回调方法,它...
在Android开发中,有时会遇到一个常见的问题:当用户在悬浮窗内的EditText输入时,软键盘弹出可能会遮挡住部分视图,导致用户体验下降。本文将深入探讨如何解决这一问题,并实现软键盘与悬浮窗的联动,即软键盘弹出...
综上所述,实现禁止软键盘弹出并使用自定义键盘的功能,涉及到了Android布局设计、事件监听、DialogFragment的使用以及输入管理等多个方面。通过合理的设计和编程,我们可以提供更符合应用场景的用户体验。在keydemo...
EditText是用户输入文字的控件,当其获得焦点时,系统默认会弹出软键盘。而Activity则是应用的容器,它可以监听到整个屏幕的触摸事件。 要实现点击空白区域或EditText以外的地方隐藏软键盘,我们需要自定义一个...
总之,监听软键盘弹出和收回是Android开发中的一个重要环节,它可以帮助我们优化布局,提高应用的可用性和美观性。通过理解各种监听方法并结合实际应用场景,我们可以实现更加智能化的界面管理,提升用户在使用应用...
3. **弹出系统软键盘**:在JavaScript中,直接弹出系统软键盘并不直接支持,因为这涉及到浏览器的安全限制。但是,可以借助HTML5的input元素的type属性,例如`<input type="text" inputmode="numeric">`可以触发数字...
在Android开发中,软键盘的弹出与隐藏会影响到应用程序界面的布局,特别是在处理输入框时,用户可能会遇到因软键盘弹出导致底部元素被遮挡的问题。本示例"监听软键盘弹出改变布局demo"旨在解决这一问题,提供了一种...
"editview软键盘自动弹出和隐藏"这个话题就是关于如何控制这一过程。 首先,要实现EditView聚焦时自动弹出软键盘,可以使用`InputMethodManager`类。这个类提供了与输入方法交互的方法,如显示或隐藏软键盘。在...
例如,当软键盘弹出时,可以将底部的按钮区域设置为透明或隐藏,以避免被键盘遮挡。 总之,理解和掌握软键盘与UI布局的交互对于Android开发者来说非常重要,能够帮助我们创建更加用户友好的应用。通过监听布局变化...
总的来说,监听软键盘弹出与退出是Android开发中的一个重要技巧,它有助于我们提供更符合用户预期的交互体验。通过合理地利用各种监听机制,我们可以更好地控制界面的动态行为,提升应用的质量。