2011-11-04 102 views
7

我的布局中有一个WebView和一些按钮。我的WebView中有一个大标签。这个应用程序用于编辑文本文件。这些按钮用于影响WebView中的textarea。当用户按下一个按钮(例如箭头按钮来移动文本视图)时,它将关闭键盘。我使用了toggleSoftInput,但只是切换键盘来显示或不显示。我想让这些按钮在按下按钮时停止隐藏软键盘。我没有发现任何关于我的具体问题。我已经搜索了几个星期。任何人有任何想法,我怎么能阻止我的按钮隐藏Android软键盘?防止按键隐藏Android上的软键盘

回答

4

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

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

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

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

这是从先前选择的输入/文本字段失去焦点的问题。 1)选择输入用于输入 2)loadUrl被称为 3)键盘仍然打开,但键入它什么都不做(你不再输入相同的输入 –

+0

@HaykSaakian真的吗?我不知道;我对我有用,而且我不会在我把它放在这里时犯错。我假设你正在尝试输入与运行loadUrl相同的webview,对吧? – Erhannis

+0

也许这只是一小段时间窗口,在你的情况下,你没有注意到它?在我的情况下,我有一个页面,我每秒多次调用loadUrl(聊天页面使用java websockets,使用loadUrl使用javascript注入消息) –

0

Xamarin的Android(备选):

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