Выберите элемент внутри WebView и получите подробную информацию - PullRequest
0 голосов
/ 11 мая 2018

Я реализовал веб-просмотр в своем приложении для Android и пытаюсь выделить или отметить элемент, когда пользователь нажимает на макет.

Веб-просмотр инициализируется следующим образом:

myWebView.getSettings().setJavaScriptEnabled(true);
//myWebView.getSettings().setGeolocationEnabled(true);
//myWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
myWebView.getSettings().setBuiltInZoomControls(true);
myWebView.getSettings().setDomStorageEnabled(true);
myWebView.setWebViewClient(new WebViewController());

Попыткаотметить элемент, на который пользователь нажал, например, как на этом скриншоте:

selection_java

Выбор с точкой

Я получаювсе страницы div с помощью jsoup:

doc = Jsoup.connect(url).get();
final Elements alldivs = doc.select("div");
ArrayList<String> list = new ArrayList<String>();
for (org.jsoup.nodes.Element e : alldivs) {
if (!e.id().equals(""))
list.add(e.id());
}

Но как пометить выделение как на фото выше, а после этого выбрать выделенное содержимое из div id.

Как можно сделать что-то подобное?

Я использую этот javascript в веб-представлении, чтобы выделить выделение, но как программно получить выбранный элемент, например: идентификатор выбранного div или другие значения

public class MyWebViewClient extends WebViewClient {
    @Override
    public void onPageFinished(WebView view, String url) {
        view.loadUrl("javascript: "
                + "Object.prototype.each = function (fn, bind) {\n" +
                "                console.log(bind);\n" +
                "                for (var i = 0; i < this.length; i++) {\n" +
                "                    if (i in this) {\n" +
                "                        fn.call(bind, this[i], i, this);\n" +
                "                    }\n" +
                "                }\n" +
                "            };\n" +
                "\n" +
                "            var _addListener = document.addEventListener || document.attachEvent,\n" +
                "                _eventClick = window.addEventListener ? 'click' : 'onclick';\n" +
                "\n" +
                "            var elements = document.getElementsByTagName(\"div\");\n" +
                "\n" +
                "            elements.each(function (el) {\n" +
                "                _addListener.call(el, _eventClick, function () {\n" +
                                 // todo process the clicked div element
                "                    el.style.cssText = \"border-color:  black;border-style:  dashed;\"\n" +
                "                }, false);\n" +
                "            })");
    }
}

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Если я правильно понимаю, вы хотите получить некоторую информацию из компонента HTML на нативную сторону.

Согласно этому ответу невозможно передать произвольные объекты в Java, но, по крайней мере, вы можете передать HTML-код узла, по которому щелкнули мышью, и затем выполнить его собственный анализ.

Этот код, основанный на вашем коде, делает именно это.

MainActivity.java: Я думаю, это довольно очевидно.Единственное, что я отличал от вас - это получение кода Javascript из отдельного файла, чтобы его было проще поддерживать.

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final WebView myWebView = findViewById(R.id.webView);
        final WebSettings settings = myWebView.getSettings();

        settings.setJavaScriptEnabled(true);
        myWebView.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                final String injectedJs = "javascript:(function(){" + injectedJs() + "})()";
                myWebView.loadUrl(injectedJs);
            }
        });

        myWebView.addJavascriptInterface(
                new Object() {
                    @JavascriptInterface
                    public void onClick(String param) {
                        Toast.makeText(MainActivity.this, param, Toast.LENGTH_LONG).show();
                    }
                },
                "appHost"
        );
        myWebView.loadUrl("https://google.com");
    }

    // Javascript code to inject on the Web page
    private String injectedJs() {
        BufferedReader stream = null;
        StringBuilder jsBuilder = new StringBuilder();
        try {
            stream = new BufferedReader(new InputStreamReader(getAssets().open("js.js")));
            String line;
            while ((line = stream.readLine()) != null) {
                jsBuilder.append(line.trim());
            }
            return jsBuilder.toString();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (stream != null) {
                try {
                    stream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return "";
    }
}

js.js: Основой этой части является ваш код.Имейте в виду, что, поскольку injectedJs() удаляет все маркеры строк, каждый оператор должен завершаться, включая комментарии, следовательно, /*...*/ вместо //

/* Keep track of the last clicked element so we can un-highlight it */
var lastSelectedItem = null;

var showHighlighted = function(/* HTML element */view, /*boolean */highlighted) {
    if (view) {
        view.style.cssText = highlighted? 'border-color: black;border-style: dashed;' : '';
    }
};

/* This new method, _addEventListener and _eventClick are the same as yours */
Object.prototype.each = function (fn, bind) {
                for (var i = 0; i < this.length; i++) {
                    if (i in this) {
                        fn.call(bind, this[i], i, this);
                    }
                }
            };

var _addListener = document.addEventListener || document.attachEvent,
    _eventClick = window.addEventListener ? 'click' : 'onclick';

/* I changed the element selection criteria, but you can change it back easily.
   I am adding event listeners all the leaf elements in the DOM. */
var elements = document.body.getElementsByTagName('*');
elements.each(function (el) {
    if (el.children.length == 0) {
        _addListener.call(el, _eventClick, function () {
            /* First, deal with the previously selected item*/
            showHighlighted(lastSelectedItem, false);
            if (lastSelectedItem !== null) {
                appHost.onClick(lastSelectedItem.outerHTML);                
            }

            /* Update the selected item reference */
            lastSelectedItem = el;


            /* Finally, deal with the previously selected item*/
            showHighlighted(lastSelectedItem, true);
            appHost.onClick(el.outerHTML);
        }, false);
    }
});
0 голосов
/ 21 мая 2018

рассматривать веб-представление как представление веб-страницы.Вам необходимо настроить элемент в этом веб-представлении для отправки запроса, который будет запускать намерение в вашем приложении для Android, что возможно, но это не будет работать для нескольких пользователей, если вы не знаете пользователя в этом веб-представлении и не аутентифицируете пользователей.... дело в том, что это очень сложно, если вы хотите отправить этот запрос из Интернета в логическую часть вашего приложения.Даже если вы можете сделать это, это не оптимально, и я не одобряю это.

С другой стороны, что вы можете сделать, если вы настаиваете на использовании веб-представлений, так это на том, чтобы завершить оставшиеся логические операции в Интернете.Посмотреть.Не возвращайтесь из веб-представления к Java-логике приложения.

Обычно веб-представления используются для отображения чего-либо, а не для выполнения действий в приложении.(действие может быть использовано в одном и том же веб-представлении)

Надеюсь, вы получите, я пытался объяснить как можно больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...