TextView не обновляется после создания новой активности - PullRequest
0 голосов
/ 17 января 2020

Я новичок в Android и застрял. У меня есть Textview on Activity, который должен показывать результат, но по какой-то причине он обновляет TextView только в том случае, если вы нажимаете кнопку, которая ничего не делает, или если вы закрываете приложение и снова открываете его из меню запущенных приложений. Я полагаю, это как-то связано с обновлением активности. Заранее спасибо!

package com.example.visacheck;

import android.content.Intent;
import android.os.Bundle;
import android.webkit.JavascriptInterface;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

public class FourthActivity extends AppCompatActivity {

    String aplicationNumber;
    String type;
    String year;


    @Override
    protected void onCreate(Bundle savedInstanceState) {

        this.getSupportActionBar().hide();
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fourth);

        Intent intent = getIntent();
        final Button button = findViewById(R.id.resultButton); //Result appearing only after clicking button

        aplicationNumber =  intent.getStringExtra("aplicationNumber");
        type = intent.getStringExtra("type");
        year = intent.getStringExtra("year");

            class MyJavaScriptInterface {
                @JavascriptInterface
                @SuppressWarnings("unused")
                public void processHTML(String html) {
                    TextView text = findViewById(R.id.textView);
                    text.setText(html);
                }
            }


            final WebView myWebview = findViewById(R.id.webview);
            myWebview.getSettings().setJavaScriptEnabled(true);
            myWebview.addJavascriptInterface(new MyJavaScriptInterface(), "HTMLOUT");

            myWebview.setWebViewClient(new WebViewClient() {
                @Override
                public void onPageFinished(WebView view, String url) {

                    myWebview.loadUrl(("javascript:document.getElementById('edit-ioff-application-number').value = '" + aplicationNumber + "';void(0);"));
                    myWebview.loadUrl(("javascript:" + "document.getElementById('edit-ioff-application-code').value = '" + type + "';void(0);"));
                    myWebview.loadUrl(("javascript:document.getElementById('edit-ioff-application-year').value = '" + year + "';void(0);"));
                    myWebview.loadUrl(("javascript:document.getElementById('edit-submit-button').click();"));
                    myWebview.loadUrl("javascript:window.HTMLOUT.processHTML(document.getElementsByClassName('alert alert-warning')[0].innerText);");
                    myWebview.loadUrl("javascript:window.HTMLOUT.processHTML(document.getElementsByClassName('alert alert-success')[1].innerText);");
                    myWebview.loadUrl("javascript:window.HTMLOUT.processHTML(document.getElementsByClassName('alert alert-danger')[0].innerText);");

                }
            });
            myWebview.loadUrl("https://frs.gov.cz/ioff/application-status");
    }

}

1 Ответ

1 голос
/ 17 января 2020

Я не собираюсь делать очень хорошую работу в этом, поскольку я едва могу затронуть предмет самостоятельно. Может быть, кто-то с большим знанием может go в деталях, но общая идея здесь состоит в том, что этот код вызывается потоком JS, а не вашим потоком пользовательского интерфейса (который является единственным потоком, которому разрешено обрабатывать обновления пользовательского интерфейса) ), и я удивлен, что этот код не делает sh, если честно. Метод post() добавляет это в очередь сообщений представления, что означает, что текст будет обновлен ПОСЛЕ представления и не имеет других задач для выполнения. Я знаю, что плохо объяснил это, но для получения дополнительной информации, пожалуйста, обратитесь к ним:

Что именно делает метод записи?

Поочередно вы может ли пользователь runOnUIThread(), пример:

Как мы используем runOnUiThread в Android?

Я уверен, что многие люди уже объяснили это лучше чем у меня. Но самое важное, что нужно понять, это то, что вы не должны обновлять пользовательский интерфейс из чего-либо кроме потока пользовательского интерфейса

Обратите внимание, что я выбрал myWebView произвольно, и это должно работать, если опубликовано на основной вид фрагмента, а также.

class MyJavaScriptInterface {
        @JavascriptInterface
        @SuppressWarnings("unused")
        public void processHTML(final String html) {
            myWebview.post(new Runnable() {
                @Override public void run() {
                    TextView text = findViewById(R.id.textView); text.setText(html);
                }
            });
        }
    }
...