检测键盘何时可见或隐藏不起作用

时间:2014-03-31 08:03:28

标签: android keyboard android-edittext android-softkeyboard back

我在尝试检测软件键盘是否可见时遇到了一些问题。

我搜索解决方案(包含SO)但没有运气。 奇怪的是,我通过检查窗口大小是否已更改在同一个应用程序中执行此操作,如下所示:

final View activityRootView = findViewById(R.id.tlFull); 
//tlFull is the activity table layout
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(
new OnGlobalLayoutListener() 
{
    public void onGlobalLayout() 
    {
        int heightDiff = activityRootView.getRootView()
                .getHeight() - activityRootView.getHeight();
        if (heightDiff > 100) 
        {
           //did some stuff here
        } 
        else 
        {
           //and here
        }
    }
});

并加入     机器人:windowSoftInputMode =" adjustResize"在清单文件中。

现在我正在尝试在登录活动中执行相同的操作,但由于某种原因,由于某种原因,heightDiff始终为38,因此这不再有效。同样适用于SO上使用相同方法的每种方法。

我也试过了,但它总是返回true。

final View activityRootView = findViewById(R.id.tlFull);
activityRootView.getViewTreeObserver()
        .addOnGlobalLayoutListener(new OnGlobalLayoutListener() 
{
      @Override
      public void onGlobalLayout() 
      {
          if (getResources().getConfiguration()
                            .keyboardHidden == Configuration.KEYBOARDHIDDEN_NO) 
          {}
          else
          {}
      }
 });

另外,由于我没有使用片段,我不能使用它:

InputMethodManager imm = (InputMethodManager) getActivity()
            .getSystemService(Context.INPUT_METHOD_SERVICE);

if (imm.isAcceptingText()) 
{} 
else 
{}

我也尝试过不同的方法。 我在etPass(触发键盘的编辑文本)onClick方法中执行我想要做的事情:

etPass.setOnClickListener(new OnClickListener() 
{
    public void onClick(View viewIn) 
    {
    ivImageView.setVisibility(View.GONE);
    }
});

不幸的是,即使键盘显示图像视图并不总是在第一次点击时消失,所以我必须再次点击。

第二个问题是我试图在onBackPressed()方法中再次显示iv。这有效但不应该如何。

当我第一次按下后退按钮时键盘消失但我必须再次点击才能使图像可见。 (我尝试了这里提供的解决方案,但它没有工作:EditText with soft keyboard and "Back" button

此外,这会阻止应用关闭onBackPressed()。

关于如何解决这个问题以及为什么差异总是一样的想法? 我无法找到更好的解决方案,现在我担心未来旧活动可能出现同样的问题(尽管它在测试中可以正常工作)

1 个答案:

答案 0 :(得分:2)

您只需使用此方法来感知应用程序中的配置更改....

@Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);   

        // Checks whether a hardware keyboard is available
        if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) {

        } else if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES) {

        }
    }