【问题标题】:Prevent Buttons From Hiding Soft Keyboard On Android防止按钮在 Android 上隐藏软键盘
【发布时间】:2011-12-22 10:03:21
【问题描述】:

我的布局中有一个 WebView 和一些按钮。我的 WebView 中有一个大标签。此应用程序用于编辑文本文件。这些按钮用于影响我的 WebView 中的文本区域。当用户按下按钮(例如移动文本视图的箭头按钮)时,它会关闭键盘。我使用了toggleSoftInput,但这只是切换键盘是否显示。我希望按钮在按下按钮时停止隐藏软键盘。我没有发现任何关于我的具体问题的信息。我已经搜索了几个星期。有人知道如何阻止我的按钮在 Android 上隐藏软键盘吗?

【问题讨论】:

    标签: android button keyboard hide pressed


    【解决方案1】:

    您的问题的解决方案可能是保持键盘始终显示并让用户在操作完成后关闭它。

    InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
    inputManager.toggleSoftInput (InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
    

    在您的 Activity 的 onCreate() 方法中尝试此代码。 请注意,如果用户按下键盘上的关闭按钮或后退按钮,它应该将其关闭。我想你不应该干涉那种情况。 操作完成后,您可以从代码中关闭键盘。

    【讨论】:

      【解决方案2】:

      我的情况完全一样,所以如果你找到了理想的解决方案,我很乐意听到。

      编辑: 成功!或者比以前好多了,无论如何。我已经删除了我的旧解决方案,因为这个更好。

      正如https://stackoverflow.com/a/10536033/513038 中所述,事实证明 loadData() 隐藏了键盘。 然而,我发现在 WebView 的 hideSoftKeyboard() 中,它通过 imm.isActive(mWebView) 检查 InputMethodManager 以查看 webview 是否处于活动状态。

      因此,如果您在 loadData() 之前将焦点切换到 EditText,并在之后立即切换回 WebView,则键盘会卡住!它会短暂切换为大写,我认为在将焦点返回到 webview 时,(实际上,这似乎并不总是发生;这取决于)但它比键盘闪烁并返回要少得多。

      需要做的事情的要点如下。

      扩展 WebView。给它一个 EditText 字段:

      public EditText mFocusDistraction;
      

      在构造函数中,有以下几行:

      mFocusDistraction = new EditText(context);
      addView(mFocusDistraction);
      

      然后重写 loadUrl():

      public void loadUrl(String s) {
          mFocusDistraction.requestFocus();
          super.loadUrl(s);
          this.requestFocus();
      }
      

      这应该让它工作,基本上。不过,它有点错误,所以这里有一个更完整的类:

      import android.app.Activity;
      import android.content.Context;
      import android.util.AttributeSet;
      import android.webkit.WebView;
      import android.widget.EditText;
      
      public class WebViewMod extends WebView {
          public EditText mFocusDistraction;
          public Context mContext;
      
          public WebViewMod(Context context) {
              super(context);
              init(context);
          }    
      
          public WebViewMod(Context context, AttributeSet attrs) {
              super(context, attrs);
              init(context);
          }    
      
          public WebViewMod(Context context, AttributeSet attrs, int defStyle) {
              super(context, attrs, defStyle);
              init(context);
          }
      
          public WebViewMod(Context context, AttributeSet attrs, int defStyle, boolean privateBrowsing) {
              super(context, attrs, defStyle, privateBrowsing);
              init(context);
          }
      
          public void init(Context context) {
              // This lets the layout editor display the view.
              if (isInEditMode()) return;
      
              mContext = context;
      
              mFocusDistraction = new EditText(context);
              mFocusDistraction.setBackgroundResource(android.R.color.transparent);
              this.addView(mFocusDistraction);
              mFocusDistraction.getLayoutParams().width = 1;
              mFocusDistraction.getLayoutParams().height = 1;
          }
      
          @Override
          public void loadUrl(final String url) {
              if (mContext instanceof Activity && this.isFocused()) {
                  ((Activity)mContext).runOnUiThread(new Runnable() {
                      @Override
                      public void run() {
                          mFocusDistraction.requestFocus();
                          WebViewMod.super.loadUrl(url);
                          WebViewMod.this.requestFocus();
                      }
                  });
              } else {
                  super.loadUrl(url);
              }
          }
      }
      

      【讨论】:

      • 这会导致从先前选择的输入/文本字段中失去焦点。 1) 选择输入进行输入 2) 调用 loadUrl 3) 键盘仍在运行,但输入它什么也不做(您不再输入相同的输入
      • @HaykSaakian 真的吗?我不知道;我所拥有的东西对我有用,我不认为当我把它放在这里时我犯了任何错误。我假设您正在尝试输入与运行 loadUrl 相同的 web 视图,对吗?
      • 也许这只是一个很小的时间窗口,在你的情况下你没有注意到它?就我而言,我有一个页面,我每秒调用 loadUrl 多次(聊天页面使用 java websockets,使用 loadUrl 和 javascript 注入消息)
      • @HaykSaakian 嗯,是的,这可能会做到。在 loadUrl 运行时,它确实将焦点从 web 视图上移开一会儿。不知道如何解决这个问题;对不起。
      【解决方案3】:

      Xamarin Android(替代):

      InputMethodManager inputManager = (InputMethodManager)GetSystemService(Context.InputMethodService); 
      inputManager.ToggleSoftInput (ShowFlags.Forced, HideSoftInputFlags.ImplicitOnly);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-06-17
        • 1970-01-01
        • 2019-06-24
        • 2012-05-31
        • 2011-08-29
        • 2015-02-27
        • 1970-01-01
        相关资源
        最近更新 更多