防止Android软键盘隐藏按钮

9

我在布局中有一个WebView和一些按钮。我的WebView中有一个大的<textarea>标签。这个应用程序用于编辑文本文件。按钮用于影响WebView内部的文本区域。当用户按下一个按钮(例如箭头按钮以移动文本视图)时,它会关闭键盘。我已经使用了toggleSoftInput,但那只是切换键盘的显示或隐藏。我希望按钮在被按下时不再隐藏软键盘。我对我的具体问题找不到任何解决方法。我已经搜索了几周。有人知道如何停止Android上的按钮隐藏软键盘吗?

3个回答

6
您的问题的解决方案可能是保持键盘始终显示,并允许用户在操作完成后关闭它。
InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
inputManager.toggleSoftInput (InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);

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


4
我和你一样,如果你找到了理想的解决方案,我很乐意听听。
编辑:成功了!或者说比以前好多了。我删除了旧的解决方案,因为这个更好。
正如https://dev59.com/XWPVa4cB1Zd3GeqP7qei#10536033中所述,loadData()会隐藏键盘。然而,我发现在WebView的hideSoftKeyboard()中,它通过imm.isActive(mWebView)检查InputMethodManager是否处于活动状态。
因此,在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
  1. 选择输入以进行打字
  2. 调用loadUrl
  3. 键盘仍然弹出,但在其中打字不起作用(您不再在同一个输入框中打字)
- Hayk Saakian
@HaykSaakian 真的吗?我不知道;我的代码对我来说是有效的,而且我认为我在发布它时没有犯任何错误。我假设你正在尝试在与运行loadUrl相同的webview中输入文本,对吗? - Erhannis
也许只是一小段时间,在你的情况下你没有注意到吗?在我的情况下,我有一个页面,每秒钟调用loadUrl很多次(聊天页面使用Java WebSockets注入消息,使用JavaScript调用loadUrl)。 - Hayk Saakian
@HaykSaakian 嗯,是的,那可能会起作用。在 loadUrl 运行时,它确实会将焦点移开 webview 一会儿。我不知道该如何修复它,抱歉。 - Erhannis

0

Xamarin Android(替代方案):

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接