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

标签 android webview back

我有一个 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 以在 中获取 Form具有 id=tsf(这是 Google.com 中搜索表单的唯一 ID)的 >Google.com 页面.

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

This will happen to all other pages

除非您知道页面中表单的id(这对于WWW 中包含多个表单的每个页面来说几乎是不可能的)。 您可以遍历所有 Forms删除 text 中的最后一个 char Forminput 类型为 text


例子

首先创建一个方法来运行JS脚本(注意在WebView中有不同的方式来执行JS Android,如果以下方法对您不起作用,请查看更多详细信息 here ):

public void run(final String script) { 
      mWebView.post(new Runnable() {
          @Override
          public void run() { 
              mWebView.loadUrl("javascript:" + script); 
          }
      }); 
}

然后创建一个返回 JS 字符串的方法:

  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 :

添加到 list :

<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());
    }
}

结果

Test

关于android - 按下后退按钮时删除 webview 文本区域中的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51150188/

相关文章:

java - LibGDX,我应该如何在屏幕和舞台内组织代码?

Android WebView 和 CSS 媒体查询

back - 如何使用浏览器中的 'BACK' 按钮转到任务流中的上一页?

notepad++ - 在 Notepad++ 中向后导航的键盘快捷键

ios - 当我从 View 返回时,标签栏不显示

java - 我可以在 Google Glass 语音识别中使用希伯来语吗?

android - 错误 : <item> inner element must either be a resource reference or empty?

java.lang.NoClassDefFoundError : Failed resolution of: Landroid/webkit/SafeBrowsingResponse 错误

javascript - shouldOverrideUrlLoading 仅针对某些网页被调用

android - 如何正确传递上下文?