Реализация обратного вызова для изменения EditText в MainActivity из настраиваемого WebViewClient

75% примеров веб-браузера Android не используют EditText, чтобы пользователь мог изменять URL-адреса. В этих последних 25%, которые дают вам образец EditText для изменения URL-адреса, они останавливаются и не подсказывают вам, как поддерживать этот URL-адрес EditText в обновленном состоянии после завершения загрузки страницы. Часто мой отображаемый URL не соответствует текущей странице, на которую я был перенаправлен.

Проблема, похоже, в том, что я хотел бы поместить класс MyWebViewClient в файл Java отдельно от основного действия. Мой пользовательский WebViewClient позволяет мне использовать метод переопределения onPageFinished (представление WebView, строковый URL-адрес) для обновления моей переменной, когда страница завершает загрузку, но я сталкиваюсь с препятствием, когда это оказывается поле редактирования текста основных действий.

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

Вот моя ошибка:

MyWebViewClient (MyCallBack)in MyWebViewClient cannot be applied to ()

Вот моя основная деятельность

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


    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    myWebView = (WebView) findViewById(R.id.webView);
    WebSettings webSettings=myWebView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    myWebView.setWebViewClient(new MyWebViewClient());//<---Error here
    editText = (EditText) findViewById(R.id.url_search);
    ...
}

Вот файл класса MyWebViewClient.java

package com.example.owner.webbrowserwithnavigation;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.EditText;
import android.widget.TextView;
import java.net.URI;
import java.net.URISyntaxException;

public class MyWebViewClient extends WebViewClient {

    MyCallBack mCallBack = null;
    public MyWebViewClient(MyCallBack callBack){
        this.mCallBack=callBack;
    }

    public void onPageFinished(WebView view, String url) {
        this.mCallBack.UpdateMyText(url);
    }
}

Вот файл класса MyCallback.java

package com.example.owner.webbrowserwithnavigation;

interface MyCallBack
{
    // Declaration of the template function for the interface
    public void UpdateMyText(String mystr);
}

Может, я ошибаюсь. Возможно, есть простой способ сделать это, но WebViewClient должен обновить EditText из основного действия после загрузки страницы, поэтому мне кажется, что мне нужно вызвать его из WebViewClient.

Спасибо за любые советы.

У вас есть edittext и webview, и вам нужно, чтобы URL-адрес был установлен в edittext при загрузке webview finish.right?

Amit Ranjan 02.05.2018 07:27

Да, у меня есть текст редактирования для основного действия, и у меня также есть веб-просмотр, который отображает это основное действие. Код из настраиваемого клиента webview не может получить доступ к основным действиям url_edittext после завершения загрузки веб-просмотра.

PPL 02.05.2018 15:20
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
262
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте MyWebViewClient следующим образом:

1. Использование анонимного класса

    myWebView.setWebViewClient(new MyWebViewClient(new MyCallBack(){
                    @Override
                    public void UpdateMyText(String mystr) {
                        editText.setText(mystr);
                    }
                }));

вместо

myWebView.setWebViewClient(new MyWebViewClient());

2. ИЛИ Реализуя обратный вызов

public class YourActivity extends AppCompatActivity implements MyCallBack{
......
......

 @Override
 public void UpdateMyText(String mystr) {
         editText.setText(mystr);
 }
}

затем установите клиент веб-просмотра, например:

myWebView.setWebViewClient(new MyWebViewClient(this));

Спасибо @Deven, ты гений :-). Мне нужно больше практики с такими обратными вызовами через классы. Это сработало. Я отмечу его как принятый ответ через пару дней, если никто не ответит более простым способом - просто изменить текст редактирования из моего настраиваемого клиента webview.

PPL 02.05.2018 15:23

Добро пожаловать, сначала я использовал анонимный класс, может быть, это кажется немного сложным, тогда вы также можете попробовать второй способ (я редактировал и).

Deven 02.05.2018 15:54

Отлично @ Девен. Вариант 2 мне больше нравится. Просто интересно, есть ли другой способ сделать это без обратного вызова.

PPL 02.05.2018 18:27

Другие вопросы по теме