如何检查Android中软件键盘的可见性?

如何检查Android中软件键盘的可见性?,第1张

如何检查Android中软件键盘的可见性?

NEW ANSWER 添加于2012年1月25日

自从写下以下答案以来,有人让我了解到ViewTreeObserver和朋友,自版本1以来就一直潜伏在SDK中的API。

不需要自定义Layout类型,一种更简单的解决方案是为活动的根视图提供一个已知的ID,例如@+id/activityRoot,将GlobalLayoutListener挂接到ViewTreeObserver中,然后从中计算活动的视图根与窗口大小之间的大小差:

final View activityRootView = findViewById(R.id.activityRoot);activityRootView.getViewTreeObserver().addonGlobalLayoutListener(new onGlobalLayoutListener() {    @Override    public void onGlobalLayout() {        int heightDiff = activityRootView.getRootView().getHeight() - activityRootView.getHeight();        if (heightDiff > dpToPx(this, 200)) { // if more than 200 dp, it's probably a keyboard... // ... do something here        }     }});

使用实用程序,例如:

public static float dpToPx(Context context, float valueInDp) {    DisplayMetrics metrics = context.getResources().getDisplayMetrics();    return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, valueInDp, metrics);}

简单!

注意: 您的应用程序必须在Android Manifest中设置此标志,android:windowSoftInputMode=”adjustResize”否则以上解决方案将不起作用。

原始答案

是的,这是可能的,但它比应做的要难得多。

如果我需要关心键盘何时出现和消失(这是很常见的),那么我要做的就是将顶层布局类自定义为覆盖onMeasure()。基本逻辑是,如果布局发现自己填充的内容明显少于窗口的总面积,那么可能会显示软键盘。

import android.app.Activity;import android.content.Context;import android.graphics.Rect;import android.util.AttributeSet;import android.widget.LinearLayout;public class LinearLayoutThatDetectsSoftKeyboard extends LinearLayout {    public LinearLayoutThatDetectsSoftKeyboard(Context context, AttributeSet attrs) {        super(context, attrs);    }    public interface Listener {        public void onSoftKeyboardShown(boolean isShowing);    }    private Listener listener;    public void setListener(Listener listener) {        this.listener = listener;    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        int height = MeasureSpec.getSize(heightMeasureSpec);        Activity activity = (Activity)getContext();        Rect rect = new Rect();        activity.getWindow().getDecorView().getWindowVisibleDisplayframe(rect);        int statusBarHeight = rect.top;        int screenHeight = activity.getWindowManager().getDefaultDisplay().getHeight();        int diff = (screenHeight - statusBarHeight) - height;        if (listener != null) { listener.onSoftKeyboardShown(diff>128); // assume all soft keyboards are at least 128 pixels high        }        super.onMeasure(widthMeasureSpec, heightMeasureSpec);}    }

然后在您的Activity类中…

public class MyActivity extends Activity implements LinearLayoutThatDetectsSoftKeyboard.Listener {    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        ...        LinearLayoutThatDetectsSoftKeyboard mainLayout = (LinearLayoutThatDetectsSoftKeyboard)findViewById(R.id.main);        mainLayout.setListener(this);        ...    }    @Override    public void onSoftKeyboardShown(boolean isShowing) {        // do whatever you need to do here    }    ...}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5500629.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-13

发表评论

登录后才能评论

评论列表(0条)

保存