我有一个活动使用“adjustPan”作为其调整大小配置,我需要在不使用“adjustResize”的情况下计算键盘高度,因为我需要将某些视图保留为全屏(这意味着它们应该保留在原位,键盘应该隐藏它们),并将视图放在键盘正上方。我们的应用程序有一个消息按钮,我通过按钮点击打开键盘。当它发生时,我使用OnGlobalLayoutListener并使用“getWindowVisibleDisplayFrame”方法来获取键盘的高度。以下是它的一些代码:
private void message()
{
InputMethodManager methodManager =
(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (methodManager != null && !isKeyboardOpen)
{
methodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
if (bottomCoordinate == 0)
{
RelativeLayout layout = findViewById(getFullScreenContainerId());
layout.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener()
{
@Override
public void onGlobalLayout()
{
layout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
Rect r = new Rect();
layout.getWindowVisibleDisplayFrame(r);
bottomCoordinate = r.bottom - r.top;
translateMessageView(bottomCoordinate);
}
});
}
else
translateMessageView(bottomCoordinate);
isKeyboardOpen = true;
}
}
“TranslateMessageView”基本上将视图的Y坐标设置为“底部坐标-view.getHeight()”。这一直有效,直到软键盘应用程序的自动更正部分变得可见。显然,“getWindowVisibleDisplayFrame”方法似乎没有添加视图的自动更正部分,或者当软键盘的自动更正部分出现时不调用“onGlobalLayout”方法,并且定位的视图保持在其下方,使其半可见。我需要能够再次调整它的位置,那么我该怎么办?正确的方法是什么?任何建议都很有价值,谢谢。
(非原答案)
Rect r=新的Rect();
View rootview = this.getWindow().getDecorView();this = 活动
root view . getwindowvisibledisplayframe(r);
这样做的结果是应用程序在屏幕上使用的空间量(即使活动未调整大小也可以工作)。显然,剩余的屏幕空间将由键盘使用(如果可见)
在这里找到id:https://github.com/freshplanet/ANE-KeyboardSize/blob/master/android/src/com/freshplanet/ane/KeyboardSize/getKeyboardY.java
您可以访问原始答案
获取软键盘的尺寸
这是我在任何活动中检测键盘高度的方法,这也迎合了缺口/切口高度(如果有的话)。
< code > keyboard height provider . Java
import android.content.Context;
import android.graphics.Rect;
import android.graphics.drawable.ColorDrawable;
import android.util.DisplayMetrics;
import android.view.DisplayCutout;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.WindowInsets;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import androidx.core.view.DisplayCutoutCompat;
import androidx.core.view.OnApplyWindowInsetsListener;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
public class KeyboardHeightProvider extends PopupWindow implements OnApplyWindowInsetsListener {
private View decorView;
private DisplayMetrics metrics;
private LinearLayout popupView;
private ViewTreeObserver.OnGlobalLayoutListener globalLayoutListener;
private Rect insets = new Rect(0, 0, 0, 0);
public KeyboardHeightProvider(Context context, WindowManager windowManager, View decorView, KeyboardHeightListener listener) {
super(context);
this.decorView = decorView;
metrics = new DisplayMetrics();
windowManager.getDefaultDisplay().getMetrics(metrics);
popupView = new LinearLayout(context);
popupView.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
globalLayoutListener = () -> {
windowManager.getDefaultDisplay().getMetrics(metrics);
int keyboardHeight = getKeyboardHeight();
boolean screenLandscape = metrics.widthPixels > metrics.heightPixels;
if (listener != null) {
listener.onKeyboardHeightChanged(keyboardHeight, screenLandscape);
}
};
setContentView(popupView);
setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE | WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
setWidth(0);
setHeight(ViewGroup.LayoutParams.MATCH_PARENT);
setBackgroundDrawable(new ColorDrawable(0));
ViewCompat.setOnApplyWindowInsetsListener(popupView, this);
}
public void start() {
popupView.getViewTreeObserver().addOnGlobalLayoutListener(globalLayoutListener);
decorView.post(() -> showAtLocation(decorView, Gravity.NO_GRAVITY, 0, 0));
}
@Override
public void dismiss() {
popupView.getViewTreeObserver().removeOnGlobalLayoutListener(globalLayoutListener);
super.dismiss();
}
@Override
public WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets) {
DisplayCutoutCompat cutoutCompat = insets.getDisplayCutout();
if (cutoutCompat != null) {
this.insets.set(cutoutCompat.getSafeInsetLeft(), cutoutCompat.getSafeInsetTop(), cutoutCompat.getSafeInsetRight(), cutoutCompat.getSafeInsetBottom());
} else {
this.insets.set(insets.getSystemWindowInsetLeft(), insets.getSystemWindowInsetTop(), insets.getSystemWindowInsetRight(), insets.getSystemWindowInsetBottom());
}
if (decorView != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
WindowInsets rootWindowInsets = decorView.getRootWindowInsets();
if (rootWindowInsets != null) {
DisplayCutout displayCutout = rootWindowInsets.getDisplayCutout();
if (displayCutout != null) {
this.insets.set(displayCutout.getSafeInsetLeft(), displayCutout.getSafeInsetTop(), displayCutout.getSafeInsetRight(), displayCutout.getSafeInsetBottom());
}
}
}
return insets;
}
public int getKeyboardHeight() {
Rect rect = new Rect();
popupView.getWindowVisibleDisplayFrame(rect);
int keyboardHeight = metrics.heightPixels - (rect.bottom - rect.top) - (insets.bottom - insets.top);
int resourceID = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceID > 0) {
keyboardHeight -= context.getResources().getDimensionPixelSize(resourceID);
}
if (keyboardHeight < 100) {
keyboardHeight = 0;
}
return keyboardHeight;
}
public interface KeyboardHeightListener {
void onKeyboardHeightChanged(int height, boolean isLandscape);
}
}
关于您的活动:
>
android:windowSoftInputMode
可以是任何东西,我的是 stateHidden|adjustNothing
实现KeyboardHeightProvider.KeyboardHeightListener
添加全局变量:
private KeyboardHeightProvider keyboardHeightProvider;
在onCreate
中添加行:
keyboardHeightProvider = new KeyboardHeightProvider(this, getWindowManager(), getWindow().getDecorView(), this);
在onResume
中添加一行:
keyboardHeightProvider.start();
在 onPause
中添加以下行:
keyboardHeightProvider.dismiss();
在< code > onKeyboardHeightChanged 中
@Override
public void onKeyboardHeightChanged(int height, boolean isLandscape) {
//This will be called anytime the keyboard height has changed.
boolean keyboardOpen = height > 0;
//do what you want with Keyboard Height
}
问题内容: 请向我解释有关软键盘的问题。例如,我的活动,对话框片段或片段活动(无论如何)上都有一个EditText。这里是: 当它第一次显示时,我没有看到软键盘,必须按下editText才能获得焦点,然后出现键盘。另一个活动有所不同,当它出现在屏幕上时,将在没有任何帮助的情况下加载键盘。我认为 表示EditText将被聚焦并且键盘将出现,但是我错了。 我应该如何管理哪个组件将获得焦点,键盘将 自动
问题内容: 不同的iOS设备上的键盘高度不同。有人知道我如何以编程方式获取设备键盘的高度吗? 问题答案: 在Swift中: 您可以通过订阅通知来获取键盘高度。(假设您想知道显示的高度是多少)。 像这样: 迅捷2 迅捷3 斯威夫特4 然后,您可以使用以下功能访问高度: 迅捷2 迅捷3 斯威夫特4
我有带有edittext字段的自定义模板。当我点击软键盘上的“下一步”按钮时,它只移动了两次焦点--比按钮变成了“确定”。清单有12项。有没有办法导航到所有的项目,而不仅仅是2?你能帮帮我吗? 公共视图getView(int position,View convertView,ViewGroup parent){ }
在 Illustrator 中,可以查看所有快捷键的列表,还可以编辑或创建快捷键。键盘快捷键对话框作为快捷键编辑器,包括所有支持快捷键的命令,其中一些未在默认快捷键集中提到。 您可以定义自己的快捷键集,更改快捷键集中的个别快捷键以及在快捷键集之间切换。例如,您可以为从 “窗口 ”>“工作区 ”菜单中选择的不同工作区创建单独的组。 除了使用键盘快捷键外,您还可以使用上下文相关菜单来访问很多命令。上下
使用操作栏导航加载第二个片段后 重新加载另一个片段,动作栏仍然是visibile 我用一个测试项目用最小的代码加载片段,行为是一样的,分裂条被软键盘隐藏。我怎样才能使它从一开始就显示拆分条?
鼠标驱动的工作是触发按键按下和释放事件,通常我们只需要绑定系统的按键事件然后转换成 LCUI 的按键事件对象即可。 如需了解更多,可参考现有的鼠标驱动代码: src/platform/linux/linux_keyboard.c src/platform/linux/linux_keyboard.c src/platform/windows/windows_keyboard.c sr