Можно ли получить данные из форм HTML в андроид при использовании webView?

Я делаю очень простую форму в HTML, которая просматривается в android, используя веб-просмотр, который берет ваше имя, используя текстовое поле, и когда вы нажимаете кнопку, он отображает его в абзаце, и он создается с использованием как html, так и JavaScript. Это мой html-код:

<!DOCTYPE html>
<html>
<body>
<p> Write your name and win your favorite game console name and win it! The winners will be announced in 4 days.</p>
Type your name here: <input id="thebox" type="text" name="value" value=""><br>

    <button onclick="myFunction()">Try it</button>

    <p id="demo"></p>

    <script>
    function myFunction() {
        var x = document.getElementById("thebox").value;
        document.getElementById("demo").innerHTML = x;
    }
    </script>

    </body>
    </html>

NEW EDITED FORM

<form name="albert" action="" method="POST">

 <label for="firstname"> First Name </label>
 <br /><br />

 <input type="text" name="firstname" id="firstname" />

 <input type="submit" name="sbumit" value="Submit" />


</form>

Я хочу получить значение из поля ввода под названием "thebox" в переменной в android при нажатии кнопки, и я пробовал много вещей раньше, и я следовал методу, в котором вы добавляете JS файл, но так как я ничего не знаю о JS, поэтому я не пробовал это, и вот файл, который я вложил в мой проект, и файл называется inject.js:

document.getElementsByTagName('form')[0].onsubmit = function () {
    var objPWD, objAccount, objSave;
    var str = '';
    var inputs = document.getElementsByTagName('thebox');
    for (var i = 0; i < inputs.length; i++) {
        if (inputs[i].name.toLowerCase() === 'thebox') {
            objAccount = inputs[i];
        }
    }
    if(objAccount != null) {
        str += objAccount.value;
    }
    if(objPWD != null) {
        str += ' , ' + objPWD.value;
    }
    if(objSave != null) {
        str += ' , ' + objSave.value;
    }
    window.AndroidInterface.processHTML(str);
    return true;
};

И позже, когда я последовал этой статье, он сказал, что мне нужно поместить некоторые вещи в мою MainActivity, но так как я впервые использую webview, я не мог много понять и понял код, который я ввел в свою MainActivity:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        WebView webView = new WebView(this);
        this.setContentView(webView);

        // enable javascript
        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webView.addJavascriptInterface(new JavaScriptInterface(), "AndroidInterface");

        // catch events
        webView.setWebViewClient(new WebViewClient(){
            @Override
            public void onPageFinished(WebView view, String url) {
                try {
                    view.loadUrl("javascript:" + buildInjection());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });

        webView.loadUrl("http://someurl.com");
    }

Вложенный класс, который я создал в моей MainActivity:

class JavaScriptInterface {
        @JavascriptInterface
        public void processHTML(String formData) {
            Log.d("AWESOME_TAG", "form data: " + formData);
        }
    }

И, наконец, метод, который вводит код:

private String buildInjection() throws IOException {
        StringBuilder buf = new StringBuilder();
        InputStream inject = getAssets().open("inject.js");// file from assets
        BufferedReader in = new BufferedReader(new InputStreamReader(inject, "UTF-8"));
        String str;
        while ((str = in.readLine()) != null) {
            buf.append(str);
        }
        in.close();

        return buf.toString();
    }

Я хочу получить значение из html-формы (the-input-box), которую я покажу в веб-просмотре на Android, и действительно ли это возможно, и если да, то как и объясните? Спасибо, а также, пожалуйста, сообщите, в какой переменной я получу значение.

Ответы

Ответ 1

    Webview browser=(WebView)view.findViewById(R.id.webChart);
    browser.getSettings().setJavaScriptEnabled(true);
    browser.addJavascriptInterface(new WebAppInterface(getActivity()), "Android");
    browser.loadUrl("file:///android_asset/yourHtmlFileName.html");

добавить этот класс интерфейса, WebAppInterface

public class WebAppInterface {
 Context mContext;
 String data;

 WebAppInterface(Context ctx){
    this.mContext=ctx;
 } 


 @JavascriptInterface
 public void sendData(String data) {
    //Get the string value to process
      this.data=data;
 }
}

данные вашего HTML-кода

 function loadChartData() {
  var x = document.getElementById("thebox").value;
   Android.sendData(x);
 }

вызовите эту функцию, когда кнопка html щелкнет в веб-обозревателе Android.

UPDATE

1) По умолчанию javascript отключен в webview. чтобы включить его, получить настройки webview и вызвать setJavaScriptEnabled (true); к true.

2), чтобы создать интерфейс между вашим кодом Javascript и вашим кодом Android, вам необходимо создать класс интерфейса Javacript.

3) свяжите интерфейс между вашим кодом javascript и кодом Android, вам необходимо передать ссылку класса интерфейса и имя интерфейса, которое ваш javaScript может вызвать для доступа к классу.

4) передайте путь к файлу html для загрузки в веб-браузер (браузер).

5) создайте класс интерфейса, как показано ниже (WebAppInterface).

см. эту ссылку для получения более подробной информации   https://developer.android.com/guide/webapps/webview.html

6) в файле HTML, создайте кнопку и добавьте к ней эту кнопку и вызовите функцию sendData ( "ваше значение" ) с именем интерфейса (здесь Android).

Вот и все. вы можете передать значение из html в ваш код Android.

Ответ 2

Да, вы можете использовать javascript для получения содержимого веб-страницы. Затем используйте webview jsInterface, чтобы вернуть содержимое вам java-кода.

Обратитесь к проекту github. и этот ответ и эту статью.

final Context myApp = this;

/* An instance of this class will be registered as a JavaScript interface */
class MyJavaScriptInterface
{
    @JavascriptInterface
    @SuppressWarnings("unused")
    public void processHTML(String html)
    {
        // process the html as needed by the app
    }
}

final WebView browser = (WebView)findViewById(R.id.browser);
/* JavaScript must be enabled if you want it to work, obviously */
browser.getSettings().setJavaScriptEnabled(true);

/* Register a new JavaScript interface called HTMLOUT */
browser.addJavascriptInterface(new MyJavaScriptInterface(), "HTMLOUT");

/* WebViewClient must be set BEFORE calling loadUrl! */
browser.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageFinished(WebView view, String url)
    {
        /* This call inject JavaScript into the page which just finished loading. */
        browser.loadUrl("javascript:window.HTMLOUT.processHTML('<head>'+document.getElementsByTagName('html')[0].innerHTML+'</head>');");
    }
});

/* load a web page */
browser.loadUrl("http://lexandera.com/files/jsexamples/gethtml.html");

Надеюсь, что это поможет.

Ответ 3

Для форм с методом "GET" вы можете достичь этого довольно простого, просто переопределив метод shouldOverrideUrlLoading. Следующее решение работает только в том случае, если URL был загружен с помощью метода webview.loadUrl().

private class MWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
        // submit will end-up with url like "data:,?firstname=SomeInput&sbumit=Submit"
        if (URLUtil.isDataUrl(url)) {
            url = url.replace(":,?", ":/?"); //to be able to properly parse Uri
            Uri uri = Uri.parse(url);

            //here you can get params by field name 
            String firstname = uri.getQueryParameter("firstname");

            //we handle this URL ourselves 
            return true;
        }

        return super.shouldOverrideUrlLoading(view, url);
    }
}

Ответ 4

Да, это возможно. Попробуйте использовать ниже код

>  @Override
>     public void onCreate(Bundle savedInstanceState) {
>         super.onCreate(savedInstanceState);
>         setContentView(R.layout.web_view_layout);
>         WebView webView = (WebView) findViewById(R.id.webView);
>         webView.getSettings().setPluginState(WebSettings.PluginState.ON);
>         WebSettings webSettings = webView.getSettings();
>         webSettings.setJavaScriptEnabled(true);
>         try {
>             progressDialog = new ProgressDialog(ActivityName);
>         progressDialog.setMessage("Loading.."); progressDialog.setCancelable(false);
>             webView.setWebViewClient(new MyWebViewClient());
>             webView.loadUrl(YOUR_URL);
>         } catch (Exception e) {
>             e.toString();
>         }
>     }
> 
>     private class MyWebViewClient extends WebViewClient {
> 
>         @Override
>         public boolean shouldOverrideUrlLoading(WebView view, String url) {
>             view.loadUrl(url);
>            progressDialog.dismissProgress();
>             return true;
>         }
> 
>         @Override
>         public void onPageFinished(WebView view, String url) {
>             progressDialog.dismissProgress();
>         }
>     }

Ответ 5

Вы можете получить данные из WebView путем поиска предупреждающих сообщений.

Использовать WebChromeClient.

mWebview = (WebView)findViewById(R.id.yourwebviewlayout);
final class YourWebChromeClient extends WebChromeClient {
                @Override
                public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
                    Toast.makeText(getApplicationContext(),
                            "alert message =  " + message,
                            Toast.LENGTH_SHORT).show();
                    result.confirm();
                    return true;
                }
            }
mWebview.setWebChromeClient(new YourWebChromeClient());

Ответ 6

Чтобы передать webView с собственным андроидом, это простой способ: в js onClick на кнопке вы должны вызвать url, который содержит ваш текст, что-то вроде myPrefix://myData и в андроиде

webView.setWebViewClient(new WebViewClient()
{
   @Override
   public boolean shouldOverrideUrlLoading(final WebView view, final String url) 
    {
     if(url.startsWith("myPrefix://")) 
      {
       //get your data by split url
       return true;
      }
 return false;

});

Ответ 7

@Shariq Поскольку многие уже ответили на этот вопрос в хорошем смысле, но я думаю, что, кроме того, вам нужно разъяснить, как именно данные поступают в коды из webview в andorid, поэтому я не буду тратить впустую байты на все избыточные коды:

(Я использую ваши коды для лучшего понимания) Выполните следующие шаги в этих кодах, чтобы лучше понять:

Шаг 1:

Нам нужно определить какой-то метод на стороне Android, который может принимать некоторые данные из webview

@JavascriptInterface
//this 'formData' variable is going to accept the data from webview 
public void processHTML(String formData) {
    Log.d("AWESOME_TAG", "form data: " + formData);
}

Теперь это значение будет доступно для контекста java android side.

Шаг 2:

вот ваши HTML-коды (webview). если URL-адрес, к которому вы обращаетесь в веб-просмотре, является вашим, вы можете легко записать эти коды на html-страницу, но если вы обращаетесь к некоторому стороннему URL-адресу, вы можете вставить этот код js в веб-просмотр, просто следуя строке кода:

...
//partial code
webView.load("javascript:function myFunction() { var x = document.getElementById('thebox').value; Android.processHTML(x); } myFunction();";
... 

Итак, что именно происходит здесь:

'x' - это переменная в js, содержащая требуемое значение, а затем мы отправляем эту переменную "x" в контекст андроида через вызов метода Android.processHTML(x)

Надеюсь, это поможет вам лучше.