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



我有一个WebView和一些按钮在我的布局。在我的WebView中有一个很大的标签。这个应用程序用于编辑文本文件。这些按钮用于影响我的WebView中的文本区域。当用户按下一个按钮(比如移动文本视图的箭头按钮)时,它会关闭键盘。我使用了toggleSoftInput,但这只是切换键盘显示或不显示。我希望按钮停止隐藏软键盘时,按下按钮。关于我的具体问题,我什么也没找到。我已经找了几个星期了。有谁知道我怎么才能阻止我的按钮隐藏Android的软键盘吗?

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

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

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

我也有同样的处境,所以如果你有一个理想的解决方案,我很乐意听到。

编辑:成功!或者说比以前好多了。我已经删除了原来的解决方案,因为这个更好。

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

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

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

Xamarin Android (Alternative):

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

相关内容

  • 没有找到相关文章

最新更新