Удалить символ в текстовой области при просмотре веб-страницы при нажатии кнопки «Назад» - PullRequest
0 голосов
/ 03 июля 2018

У меня есть приложение для Android, в котором у меня есть веб-просмотр. Как я могу, когда я нажимаю кнопку "Назад" на Android, я могу удалить символ в текстовой области веб-просмотра?

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

Пожалуйста, смотрите картинку ниже, если вы не понимаете, что я сказал.

Перед нажатием назад

После нажатия назад

1 Ответ

0 голосов
/ 03 июля 2018

Нет гарантии, что на странице, загруженной пользователем, будет только один Form.

Однако, если это, в частности, Google Форма поиска, вы можете выполнить JavaScript, чтобы получить Form на странице Google.com с id=tsf (, которая является уникальной идентификатор формы поиска в Google.com).

Тем не менее, вы упомянули в своем комментарии:

Это произойдет со всеми остальными страницами

Если вы не знаете id формы на странице (, что практически невозможно для каждой страницы в WWW, содержащей более одной Form). Вы можете просмотреть все Forms и удалить последние char текста в Form input типа text.


Пример

Сначала создайте метод для запуска сценария JS ( Обратите внимание, что существуют разные способы выполнения JS в WebView в Android, для получения дополнительной информации, если следующий метод не сработал для вас смотри здесь ):

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 :

Добавить в Манифест:

<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" />

Реализация в действии:

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

...