Friday, October 30, 2015

Android webview input 无法打开输入框?



error:
今天遇到一个奇葩的问题,就是我用Webview 加载了一个网页的页面的时候,点击input 的时候 手机APP 无法弹出输入法! 纠结了好长的时间。

貌似Android 本身确实存在这个问题:
你可以查看一下这篇博客:
http://jojol-zhou.iteye.com/blog/1299017

但是,我的情况博客并没有给出解决方案:
我以为是Androidmeanfest.xml 中的文件中Activity  指定的输入法的模式有问题,我看了一下并没有隐藏。 其实只要不设置,默认的状态就可以的!
我们具体学习一下:  

【Android开发经验】android:windowSoftInputMode属性详解

http://blog.csdn.net/zhaokaiqiang1992/article/details/39761461

问题依然没有得到解决:
然后我参考了这篇博客:
http://blog.csdn.net/tu_bingbing/article/details/41810473


将我自定义的Webview 改写成:
public class ProgressBarWebView extends WebView{

    public ProgressBarWebView(Context context) {
        this(context, null);
    }

    public ProgressBarWebView(Context context, AttributeSet attrs)    {
        this(context, attrs, com.android.internal.R.attr.webViewStyle);
    }

    public ProgressBarWebView(Context context, AttributeSet attrs,     int defStyle){
        super(context, attrs, defStyle);
        // TODO
        // your code
    }
}

这种做法是正确的,但是我用Android studio complie 的时候,不能运行,这就比较蛋疼了。

解决方案:
不要使用自己的自定义的webview. 使用原生的Webview 
<WebView    android:id="@+id/webview_announcement"    android:layout_width="match_parent"    android:layout_height="match_parent"    />

然后设置:
private void initWebViewSetting() {
    WebSettings webSettings = mWebView.getSettings();    if(null != webSettings){
        webSettings.setJavaScriptEnabled(true);        webSettings.setDomStorageEnabled(true);        webSettings.setAppCacheEnabled(true);        webSettings.setSaveFormData(true);        webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);        webSettings.setSupportMultipleWindows(true);        webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);        webSettings.setAllowFileAccess(true);        webSettings.setNeedInitialFocus(true);        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);        webSettings.setLoadWithOverviewMode(true);        webSettings.setLoadsImagesAutomatically(true);        webSettings.setLoadWithOverviewMode(true);        mWebView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);        //启动硬件加速        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            mWebView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);        }
    }
}

我们看一下 webview 源码就知道了为什么?
/** * Construct a new WebView with a Context object. * @param context A Context object used to access application assets. */public WebView(Context context) {
    this(context, null);}

/** * Construct a new WebView with layout parameters. * @param context A Context object used to access application assets. * @param attrs An AttributeSet passed to our parent. */public WebView(Context context, AttributeSet attrs) {
    this(context, attrs, com.android.internal.R.attr.webViewStyle);}

/** * Construct a new WebView with layout parameters and a default style. * @param context A Context object used to access application assets. * @param attrs An AttributeSet passed to our parent. * @param defStyle The default style resource ID. */public WebView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);}


now you know!



No comments:

Post a Comment