防止在Android上隐藏软键盘的按钮

时间:2011-11-04 22:28:48

标签: android button keyboard hide pressed

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

3 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:4)

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

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

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);
        }
    }
}

答案 2 :(得分:0)

Xamarin Android(替代方案):

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