我还没有找到任何方法来解决这个问题。
我的应用程序中有一个网络视图。我希望能够检测键盘何时处于活动状态,何时处于非活动状态。当这些变化发生在网络视图中时,它似乎无法检测到。
我想对这些不同的状态执行操作。在iOS上,当键盘处于活动状态时,通过观察者进行监听非常简单。Ref UIKeyboard将显示/隐藏。
Android中是否有任何功能与这些观察者在Android中的功能相同?
希望这个问题解释得足够好。
所以我挣扎了一周左右,发现这里有很多材料是我的解决方案,我真的希望它对你有用。
所以在我的例子中,我有一个活动,我调用了一个包含Webview的片段,所以它比我想象的要复杂得多。
基本上,问题在于片段缺少这一行:
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
所以它没有意识到webview内部高度的变化。
无论如何,让我们进入代码:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = super.onCreateView(inflater, container, savedInstanceState);
//mWebView.postUrl("https://www.google.com/");
final View activityRootView = view;
layoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect r = new Rect();
//r will be populated with the coordinates of your view that area still visible.
activityRootView.getWindowVisibleDisplayFrame(r);
// This variable was created only for Debug purposes and
// to see the height change when clicking on a field inside mWebView
int screenHeight = activityRootView.getRootView().getHeight();
Log.d("onGlobalLayout", "rect: " + r.toString());
Log.d("onGlobalLayout", "screenHeight: " + screenHeight);
//The difference on the heights from bottom to top and on the root height
int heightDiff = screenHeight - (r.bottom - r.top);
Log.d("onGlobalLayout", "heightDiff: " + heightDiff);
//I suggest to put 250 on resources and retrieve from there using getResources().getInteger() to have better order
float dpx = dpToPx(getActivity(), 250);
if (previousHeightDiff != heightDiff) {
if (heightDiff > dpx) {
isSoftKeyboardPresent = true;
} else {
isSoftKeyboardPresent = false;
}
previousHeightDiff = heightDiff;
}
}
};
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(layoutListener);
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
return view;
}
private static float dpToPx(Context context, float valueInDp) {
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, valueInDp, metrics);
}
记得把你的Androidanifest.xml设置上的活动设置为:android: windowSoftInputMode=调整大小|stateHidden
片段内的变量为:
public boolean isSoftKeyboardPresent = false;
private int previousHeightDiff = -1;// this is used to avoid multiple assignments
private ViewTreeObserver.OnGlobalLayoutListener layoutListener = null;
最后
@Override
public void onPause() {
super.onPause();
final View activityRootView = getActivity().findViewById(R.id.page_content);
activityRootView.getViewTreeObserver().removeOnGlobalLayoutListener(layoutListener);
}
这应该会起作用:)那么你觉得呢?
问题内容: 理想情况下,我希望整个界面具有 自定义样式 ,该 样式 可以在ios(itouch / ipad)或具有等效虚拟键盘的android上看到。请参阅下面的更多细节。 当键盘“存在”时,自定义设置的CSS hacking规则处于活动状态也是一种可以接受的解决方案。 在网站(HTML / JavaScript / CSS)上同时定位android和ios。还请注意,内部布局为: “ flui
问题内容: 从MDN for NodeList: 在某些情况下,NodeList是一个实时集合,这意味着DOM中的更改会反映在集合中。例如,Node.childNodes处于活动状态: 在其他情况下,NodeList是静态集合,这意味着DOM中的任何后续更改都不会影响集合的内容。document.querySelectorAll返回一个静态NodeList。 所以....有点烦!是否有任何关于哪些
本文向大家介绍C#中如何检查线程是否处于活动状态,包括了C#中如何检查线程是否处于活动状态的使用技巧和注意事项,需要的朋友参考一下 要检查线程是否存在,代码如下: 示例 输出结果 这将产生以下输出- 示例 现在让我们来看另一个示例- 输出结果 这将产生以下输出-
问题内容: 因此,我正在使用下载管理器在我的应用程序中下载多个文件。开始某些活动之前,我需要这些文件才能完成下载。如何检查是否有活动的下载,所以我可以告诉用户等待下载完成。然后,当它们完成时,我需要使按钮可见。我已经用谷歌搜索过,甚至自己(盲目地)尝试了一些代码,但没有任何效果。如果有人可以向正确的方向推动我,我将不胜感激。 问题答案: 使用打听下载。调用时,返回值是下载的ID。您还可以按状态查询
问题内容: 都好 我有一个控制台项目,旨在让用户按下键盘方向键(非数字键盘)来移动化身。我在编码时很难检查是否按下了这些键。在Pascal中,使用“ readkey”和代码非常容易,例如,按下按键的代码为#80。但是,尽管我认为我了解System.in和BufferedInputStream的用法,但我对如何在Java中实现相同功能感到困惑。 有人可以帮我吗?非常感谢您的想法或提示。 问题答案: