【问题标题】:WebView gets stuck on Read-only Empty TEXTAREA on Samsung Galaxy S3 (Android 4.1.1)WebView 卡在三星 Galaxy S3 (Android 4.1.1) 上的只读空文本区域
【发布时间】:2013-03-21 09:54:01
【问题描述】:

我观察到,当我尝试点击并专注于只读且为空的 TEXTAREA 时,Android Webview 会卡住。键盘出现,当然不会在 TEXTAREA 中输入任何内容,但之后 WebView 被卡住了。

我只能使用“BACK”键强制关闭键盘,但不会执行其他操作。除了重新启动整个应用程序之外,什么也做不了。

<textarea rows="3" id="abcd" readonly="readonly" name="abcd"></textarea>

我不断在 LOGCAT 控制台中针对 webview 收到此详细消息。

singleCursorHandlerTouchEVent ~getEditableSupport FASLE

这仅在运行 Android 4.1.1 的 Samsung S3 设备上发生,并且在 Samsung Nexus S (Android 4.1.2) 和 4.1.2 Android 模拟器上完美运行。

这些链接中提出的其他解决方案无效

这个问题可以通过这个独立的 Webview 示例轻松重现

public class TestWebViewTextStylesActivity extends Activity {

    WebView mWebView = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        String data = "<html><body>" +
        "<textarea rows='3' id='abcd' readonly='readonly' name='abcd'></textarea>" +
        "</body></html>";

        mWebView = new WebView(this);
        setContentView(mWebView);

        // Set some HTML 
        mWebView.loadDataWithBaseURL("file:///android_asset/", data, "text/html", "UTF-8", null);

    }
}

【问题讨论】:

    标签: android webview textarea readonly


    【解决方案1】:

    在花了半天时间研究各种替代方案后,我找到了解决方案。

    解决方案非常简单,就是在 TEXTAREA html 标签之间引入一个空格。

    <textarea rows="3" id="abcd" readonly="readonly" name="abcd"> </textarea>
    _____________________________________________________________||___________
    ________________________________________________INSERTED___SPACE ___HERE__
    

    而且我还观察到通过 JS 将 .innerText 属性设置为 BLANK 字符串也会导致 TEXTAREA 导致 Webview 冻结。

    该空间也是必需的,如果没有该空间,浏览器将假定 TEXTAREA 后面的所有 HTML 也属于 TEXTAREA。所以正确的做法是先给一个空格,然后再补全TEXTAREA(&lt;/TEXTAREA&gt;)

    对于可写的 TEXTAREA HTML 元素,您不能有这个空白空间,否则它会以用户输入的值作为前缀。所以我必须编写一个 JS 方法,在将其设置为 WebView 之前清空我必须注入的值。

    function clearOffTextArea(textAreaId) {
    
        var x = document.getElementById(textAreaId);
    
        var isReadOnly = false;
    
        if (x.hasAttribute('readOnly')) {
            isReadOnly = x.readOnly;
        }
    
        if (isReadOnly == false) {
            if (customMethodToTrimString(x.innerText) == '') {
                x.innerText = '';
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-14
      • 1970-01-01
      • 2013-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多