【问题标题】:Detect when keyboard is visible or hidden not working检测键盘何时可见或隐藏不工作
【发布时间】:2014-05-10 11:44:12
【问题描述】:

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

我正在寻找解决方案(包括 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
        }
    }
});

并通过添加 清单文件中的 android: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() 上关闭。

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

【问题讨论】:

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


【解决方案1】:

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

@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) {

        }
    }

【讨论】:

  • 谢谢。但是, onConfigurationChanged() 不会被调用。我还在 androidmanifest 的登录活动下添加了 android:configChanges="orientation|keyboardHidden|screenSize" 但没有运气。
  • LE:它接缝 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) 阻止调用 onConfigurationChanged()。我删除了它,它会调用该方法,但仅在活动开始时才调用。
  • 你会试试这个链接我希望它对你有用.....stackoverflow.com/questions/2150078/…
  • 谢谢@Kumar。我在那里尝试了所有方法,包括 px 到 dp 的转换不幸的是高度相关,所以它仍然不起作用。
猜你喜欢
  • 2020-06-08
  • 2023-02-10
  • 2016-07-03
  • 1970-01-01
  • 2011-08-08
  • 2020-10-12
  • 2011-05-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多