Реализация обратного вызова для изменения EditText в MainActivity из пользовательского WebViewClient - PullRequest
0 голосов
/ 02 мая 2018

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

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

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

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

MyWebViewClient (MyCallBack) в MyWebViewClient нельзя применить к ()

Вот мое основное занятие

@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.

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

1 Ответ

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

Используйте 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));
...