按下后退按钮时删除 webview 文本区域中的字符

Delete a character in textarea on webview when press back button

我有一个 android 应用程序,其中有一个 webview。如何在android上按下后退键时可以删除webview文本区的一个字符?

package com.example.nqc.myapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.webkit.WebView;

public class MainActivity extends AppCompatActivity {

    private WebView mWebView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mWebView = findViewById(R.id.mWebView);
        mWebView.loadUrl("https://www.google.com");
    }

    @Override
    public void onBackPressed() {
        //delete a character
        Log.d("Debug", "Delete text on TextArea");
    }
}

不明白的请看下图。

Before press back

After press back

不能保证用户加载的页面中只有一个Form

但是,如果它特别针对 Google 搜索表单,您可以执行 JavaScript 以在 Google.com 页面中获得 Form id=tsf这是Google.com中搜索表单的唯一id)。

尽管如此,您在评论中提到:

This will happen to all other pages

除非您知道页面中表单的 id这对于 WWW 中包含多个 Form[的每个页面几乎是不可能的=85=]). 您可以遍历所有 Forms 删除 text[=85 的最后一个 char =] 在类型 textForminput 中。


例子

首先为 运行 JS 脚本创建一个方法(请注意,有不同的方法可以在 WebView 中执行 JS in Android,如果以下方法对您不起作用,请查看 here):

了解更多详情
public void run(final String script) { 
      mWebView.post(new Runnable() {
          @Override
          public void run() { 
              mWebView.loadUrl("javascript:" + script); 
          }
      }); 
}

然后创建一个方法,returns一个JS String到:

  1. 获取页面中的所有表单。
  2. 全部循环。
  3. 循环浏览每个表单的元素..
  4. 将其值设置为(其旧值 - 最后一个字符)。

private String deleteLastCharScript() {
    return  "var listOfForms = document.forms;\n" + 
            "for(var i = 0; i < listOfForms.length; i++) {\n" + 
            "   var elements = listOfForms[i].elements;\n" +
            "   for(var j = 0 ; j < elements.length ; j++){\n" +
            "       var item = elements.item(j);\n" +
            "       item.value = item.value.substring(0, item.value.length - 1);\n" + 
            "   }\n" + 
            "};";       
}

您可以在 onBackPressed() 方法中 运行 该脚本,如下所示:

@Override
public void onBackPressed() {
    run(deleteLastCharScript());
}

这是MCVE:

添加到清单:

<uses-permission android:name="android.permission.INTERNET" />

创建简单的WebView布局:

<?xml version="1.0" encoding="utf-8"?>
<WebView  xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/webView1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" />

Activity 中的实施:

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebView;

public class MainActivity extends AppCompatActivity {

    private WebView mWebView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.webview);
        mWebView = findViewById(R.id.webView1);
        mWebView.getSettings().setJavaScriptEnabled(true); // enable JS
        mWebView.loadUrl("https://www.google.com");
    }

    /**
     * Execute JS String Asynchronously
     * @param script
     */
    public void run(final String script) {
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
            // run JavaScript asynchronously
            // it works on KitKat onwards
            mWebView.evaluateJavascript(script, null);
        }else {
            // use different thread to run JavaScript asynchronously
            // because evaluateJavascript doesn't work on versions before KitKat
            new Thread(new Runnable() {
                @Override
                public void run() {
                    mWebView.post(new Runnable() {
                        @Override
                        public void run() {
                          mWebView.loadUrl("javascript:" + script);
                        }
                    });
                }
            }).start();
        }
    }


    /**
     * This JS Script tp Loop through all
     * inputs in all forms in the page
     * and remove last char from each
     * @return
     */
    private String deleteLastCharScript() {
        return  "var listOfForms = document.forms;\n" +
                "for(var i = 0; i < listOfForms.length; i++) {\n" +
                "   var elements = listOfForms[i].elements;\n" +
                "   for(var j = 0 ; j < elements.length ; j++){\n" +
                "       var item = elements.item(j);\n" +
                "       item.value = item.value.substring(0, item.value.length - 1);\n" +
                "   }\n" +
                "};";
    }


    @Override
    public void onBackPressed() {
        run(deleteLastCharScript());
    }
}

结果