创建新活动后TextView不更新

Posted

技术标签:

【中文标题】创建新活动后TextView不更新【英文标题】:TextView not updating after creating new Activity 【发布时间】:2020-05-04 11:13:17 【问题描述】:

我是 android 新手,但我卡住了。我在 Activity 上有一个 Textview 应该显示结果,但由于某种原因,只有当您单击不执行任何操作的 Button 或关闭应用程序并从正在运行的应用程序菜单再次重新打开它时,它才会更新 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");
    


【问题讨论】:

你能分享一下按钮在onClick中的作用吗? 有趣的是,没有onClick方法,这个按钮不做任何事情只存在,但是如果你点击它,TextView正在刷新 你的意思是从html设置的textview吗?当您加载页面时,它还没有完成加载 html,因此尚未设置 textview,当您从正在运行的应用程序中打开它时,它会恢复并且已经拥有数据。 你能试试这个吗? myWebView.post(new Runnable() @Override public void run() TextView text = findViewById(R.id.textView); text.setText(html); ); insde 你的 processHTML 函数 @sharone-lev 我认为你是对的,但是我如何设置条件以仅在最终加载 html 时更新 textview? 【参考方案1】:

我不会在这方面做得很好,因为我自己几乎无法触及这个主题。也许有更多知识的人可以更详细地介绍,但这里的一般想法是,这段代码是由 JS 线程调用的,而不是你的 UI 线程(这是唯一允许处理 UI 更新的线程),我老实说,我很惊讶这段代码在这样做时不会崩溃。 post() 方法将此添加到视图的消息队列中,这意味着文本将在视图呈现后更新,并且没有其他任务要执行。我知道我在解释这方面做得不好,但有关更多信息,请参阅以下内容:

What exactly does the post method do?

或者,您可以使用runOnUIThread(),例如:

How do we use runOnUiThread in Android?

我敢肯定,很多人已经比我更好地解释了这一点。但这里要理解的最重要的一点是,您不得从 UI 线程以外的任何地方更新 UI

请注意,我随意选择了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);
                
            );
        
    

【讨论】:

以上是关于创建新活动后TextView不更新的主要内容,如果未能解决你的问题,请参考以下文章

重新创建活动时如何从 AsyncTask 更新 TextView

如何通过单击 firebase 通知打开新活动并在 textview 上打印通知消息

从另一个Activity更新TextView

从主活动更新不同布局 xml 中的文本视图

如何更新/刷新 TextView 以每秒显示更新的 Json 数据?

登录后在 textview 中显示 SQLite 数据