我想根据是否显示虚拟键盘来更改布局。我搜索了 API 和各种博客,但似乎找不到任何有用的东西。
是否可以?
谢谢!
现在这是可能的:
在 Android 11 上,您可以执行
view.setWindowInsetsAnimationCallback(object : WindowInsetsAnimation.Callback { override fun onEnd(animation: WindowInsetsAnimation) { super.onEnd(animation) val showingKeyboard = view.rootWindowInsets.isVisible(WindowInsets.Type.ime()) // now use the boolean for something } })
您还可以收听显示/隐藏键盘的动画并进行相应的过渡。
我推荐阅读Android 11 preview和相应的文档
安卓 11 之前
然而,这项工作还没有在一个Compat版本中提供,所以你需要求助于黑客。
Compat
您可以获得窗口插图,如果底部插图大于您认为相当好的某个值(通过实验),您可以认为这是显示键盘。这不是很好,在某些情况下可能会失败,但没有框架支持。
这是对这个确切问题的一个很好的答案。
我是这样做的:
添加OnKeyboardVisibilityListener接口。
OnKeyboardVisibilityListener
public interface OnKeyboardVisibilityListener { void onVisibilityChanged(boolean visible); }
HomeActivity.java:
public class HomeActivity extends Activity implements OnKeyboardVisibilityListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sign_up); // Other stuff... setKeyboardVisibilityListener(this); } private void setKeyboardVisibilityListener(final OnKeyboardVisibilityListener onKeyboardVisibilityListener) { final View parentView = ((ViewGroup) findViewById(android.R.id.content)).getChildAt(0); parentView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { private boolean alreadyOpen; private final int defaultKeyboardHeightDP = 100; private final int EstimatedKeyboardDP = defaultKeyboardHeightDP + (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? 48 : 0); private final Rect rect = new Rect(); @Override public void onGlobalLayout() { int estimatedKeyboardHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, EstimatedKeyboardDP, parentView.getResources().getDisplayMetrics()); parentView.getWindowVisibleDisplayFrame(rect); int heightDiff = parentView.getRootView().getHeight() - (rect.bottom - rect.top); boolean isShown = heightDiff >= estimatedKeyboardHeight; if (isShown == alreadyOpen) { Log.i("Keyboard state", "Ignoring global layout change..."); return; } alreadyOpen = isShown; onKeyboardVisibilityListener.onVisibilityChanged(isShown); } }); } @Override public void onVisibilityChanged(boolean visible) { Toast.makeText(HomeActivity.this, visible ? "Keyboard is active" : "Keyboard is Inactive", Toast.LENGTH_SHORT).show(); } }
希望这会对你有所帮助。
或者,这里有一个页面提供了一些不同的方法来实现这个 pre Android 11:
https://developer.salesforce.com/docs/atlas.en- us.noversion.service_sdk_android.meta/service_sdk_android/android_detecting_keyboard.htm
此解决方案不适用于软键盘, onConfigurationChanged也不会用于软(虚拟)键盘。
onConfigurationChanged
您必须自己处理配置更改。
http://developer.android.com/guide/topics/resources/runtime- changes.html#HandlingTheChange
样本:
// from the link above @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); // Checks whether a hardware keyboard is available if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) { Toast.makeText(this, "keyboard visible", Toast.LENGTH_SHORT).show(); } else if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES) { Toast.makeText(this, "keyboard hidden", Toast.LENGTH_SHORT).show(); } }
然后只需更改某些视图的可见性、更新字段并更改布局文件。