在为EditText显示/解除虚拟键盘时收到通知?

时间:2011-10-28 16:05:41

标签: android

我希望在显示/解除虚拟键盘时收到通知。除了使用一些调整大小的侦听器技巧之外,这似乎是不可能的:

How to check visibility of software keyboard in Android?

我的活动只有一个EditText。我可以让专注于活动启动,然后添加一个focuschangelistener。当它获得焦点时,我可以执行onVirtualKeyboardShown()。如果我可以只听在EditText中按下的后退键,我可以将其解释为隐藏的虚拟键盘。类似的东西:

EditText et = ...;
et.setOnFocusChangedListener(new OnFocusChangedListener() {
    public void onFocusChanged(boolean focused) {
        if (focused) {
           // virtual keyboard probably showing.
        }
    }
});
et.setKeyListener(new KeyListener() {
    public void onKeyPressed(int code) {
        if (code == BACK_KEY) [ 
            if (et.isFocused()) {
                // virtual keyboard probably hiding.
                // lose focus to set up for next time.
                et.setFocused(false);
            }
        }
    }
});

考虑到虚拟键盘之间的所有差异,似乎任何方法都充满了问题,那么我们也必须处理物理键盘,

由于

2 个答案:

答案 0 :(得分:2)

  

除了使用一些调整大小的侦听器技巧

之外,这似乎是不可能的

正确。

  

我希望收到通知,以便我可以在虚拟键盘上方显示我自己的建议功能区。

并非所有Android设备都使用虚拟键盘。有些人有物理键盘。由于您需要支持这两种类型的设备,因此您需要提供一种不假设每个人都拥有虚拟键盘的UI设计。

答案 1 :(得分:1)

    // Catch the keyboard height
    final LinearLayout masterView = (LinearLayout) findViewById(R.id.conversation_prent);
    masterView.getViewTreeObserver().addOnGlobalLayoutListener(
            new ViewTreeObserver.OnGlobalLayoutListener() {
                public void onGlobalLayout() {
                    Rect r = new Rect();
                    masterView.getWindowVisibleDisplayFrame(r);

                    int result = 0;
                    int resourceId = getResources().getIdentifier(
                            "status_bar_height", "dimen", "android");
                    if (resourceId > 0) {
                        result = getResources().getDimensionPixelSize(
                                resourceId);
                    }

                    int heightDiff = masterView.getRootView().getHeight()
                            - masterView.getHeight();

                    heightDiff = heightDiff - (ab.getHeight() + result);

                    Log.e("Keyboard Size", "Size: " + heightDiff);

                    if (heightDiff > 200) {
                        // The keyboard is shown
                    } else {
                        // The keyboard is hidden
                    }
                }
            });

如果您的应用在Android上运行< 3(HoneyComb)删除与操作栏相关的代码部分。