9

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

4

3 回答 3

6

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

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

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

于 2012-06-29T20:27:58.907 回答
4

我在同一条船上,所以如果你找到了一个理想的解决方案,我很想听听。

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

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

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

需要发生的事情的要点如下。

扩展 Web 视图。给它一个 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);
        }
    }
}
于 2013-09-12T23:52:49.973 回答
0

Xamarin Android(替代):

InputMethodManager inputManager = (InputMethodManager)GetSystemService(Context.InputMethodService); 
inputManager.ToggleSoftInput (ShowFlags.Forced, HideSoftInputFlags.ImplicitOnly);
于 2016-04-29T12:47:53.250 回答