当前位置: 首页 > 面试题库 >

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

夏祺然
2023-03-14
问题内容

我需要做一个非常简单的事情-查找是否显示了软件键盘。在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;

/*
 * LinearLayoutThatDetectsSoftKeyboard - a variant of LinearLayout that can detect when 
 * the soft keyboard is shown and hidden (something Android can't tell you, weirdly). 
 */

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
    }

    ...
}


 类似资料:
  • 我有一个GLSURFACHEVIEW,在那里我呈现我的GUI。在一种情况下,我需要用户输入一个数字,为了实现这一点,我使用了一个框架布局,上面是我的GLSurfaceView,后面是另一个虚拟布局,后面是EditText。当需要输入时,我聚焦编辑文本并强制软键盘显示。然后我听各种方法来结束输入,输入键,输入法动作完成,返回键等等。 然而,我刚刚意识到一个情况,这是不起作用的。在某些键盘上有一个“隐

  • 如何处理软键盘和隐藏它使用appium Android。 以下是我的设想: 打开flipkart应用 点击搜索图标 键入一些文本[例如:汽车] 从设备键盘点击搜索图标 下面是我实现的代码: 我使用driver.rotate(屏幕定位。LANDSCAPE);"在代码中,但得到错误作为org.openqa.selenium.WebDriverExcture:一个未知的服务器端错误发生在处理命令。(警告

  • 我正在平板电脑模式下开发手机应用程序。当我们点击编辑文本时,我想禁用软键盘。谁能帮帮我吗。。提前谢谢。

  • 我有一个AutoCompleteTextView,它像往常一样在用户键入3个字母后提供建议。一旦我触摸建议列表,我想隐藏软键盘一次。我在下面用表格布局所做的只是在单击除建议列表之外的任何地方时隐藏键盘。 可扩展置标语言 爪哇岛 用于自定义列表的 XML

  • 我正在自动化一些涉及android keytool和jarsigner的东西。该工具获取一个密钥存储库、密钥存储库的密码、别名和别名/密钥的密码,我正在尝试找到一种方法来显式检查为别名/密钥提供的密码是否正确。 有什么想法吗?而且,我需要在没有要签名的jar文件的情况下检查它--在我的上下文中获取该文件是很长的,所以我希望早一点而不是晚一点中止。

  • 我有三个编辑文本字段。在这些字段中,我想只显示第一个字段的软输入键盘,并禁用后面两个字段,即日期和时间字段。 通过使用下面的代码,我可以禁用字段2和字段3的键盘,但当用户关注字段1时,键盘会出现,但当用户点击字段2或字段3时,键盘不会隐藏。虽然当第一次点击字段2或3时,不会出现键盘。 如果软输入键盘已打开,如何隐藏它?