java - 如何从外部访问onCreate中声明的Webview?

标签 java android android-studio android-webview

我正在尝试开发一些基于WebView的简单应用程序,并使Android应用程序和远程页面之间交换数据成为可能。

问题描述:

loadUrl 在 onCreate 内工作,但在 onCreate 外部无法工作。请参阅下面的代码并解释我做错了什么,为什么它在 WebAppInterface 类中不起作用:

public class MainActivity extends Activity {
    public WebView view1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String url = "htxx://mydomain.com/";
        final WebView view1 =(WebView) this.findViewById(R.id.webView);
        view1.addJavascriptInterface(new WebAppInterface(this), "Android"); //exchange between web-js and webview
        WebSettings webSettings = view1.getSettings();
        webSettings.setJavaScriptEnabled(true);
        view1.loadUrl(url);
        view1.setWebViewClient(new com.example.project.MyAppWebViewClient() {
            @Override
            public void onPageFinished(WebView view1, String url) {
                findViewById(R.id.progressBar1).setVisibility(View.GONE);
                findViewById(R.id.webView).setVisibility(View.VISIBLE);
            }
        });
        view1.setInitialScale(100);

        ///// ---> That's works:
        view1.setWebViewClient(new WebViewClient() {
            public void onPageFinished(WebView view, String url) {
                view1.loadUrl("javascript:somescript('Page is loaded')");
            }
        });

        ///// ---> That's works too:
        Button btn = (Button) findViewById(R.id.button1);
        btn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
                String device_id = tm.getDeviceId();
                view1.loadUrl("javascript:somescript('"+device_id+"')");
            }
        });
    }

    public class WebAppInterface {
        Context mContext;
        WebAppInterface(Context c) {
            mContext = c;
        }

        @JavascriptInterface
        public void showToast(String toast) {
            //show toast from web-app (js to android)
            Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
        }

        @JavascriptInterface
        public void printFromWeb() {
            //show toast from web-app (js to android)

            ///// ---> That's NOT working :(
            view1.loadUrl("javascript:somescript('Checking loadurl from outside of onCreate')");
        }
    }
}

有趣的是,Android studio 中没有出现任何错误。

最佳答案

您有 public WebView view1; 作为一个字段,并且在 onCreate() 中具有完全不同的最终 view1 ,因此它实际上在您的 public void printFromWeb() 方法。

<小时/>

这是安全的路线:

要“从外部”访问 WebView,请添加 WebView 类的私有(private)字段:

private WebView webView;

在您的 onCreate() 方法中,实例化它:

webView = (WebView) findViewById(R.id.webView);

添加 getter 方法来访问实例:

public WebView getWebView() {
    return webView;
}

记住只能在 UI 线程上触摸它。

<小时/>

更新:如何从非 ui 线程安全地访问 View :

MainActivity.this.runOnUiThread(new Runnable() {
    @Override
    public void run(){
        view1.loadUrl(...)
    }
})

关于java - 如何从外部访问onCreate中声明的Webview?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36227991/

相关文章:

java - 指南针指南到 GPS 目的地

java - 如何在 Java 或 Groovy 中找到下一个 Double?

c# - Vector3.Lerp 无法在我的相机上工作

android - Android 上共享库的偏移量

android - cordova 插件相机中 FILE_URI 和 NATIVE_URI 的区别

java - iOS 推送通知的 PHP 和 Java 字符串长度阿拉伯语文本大小问题

java - 如何使用正则表达式查找字符串中的连续重复(即 [12][12])但长度仅为 2 或更大?

日志猫中的Android Studio "Clear All",更改日志级别过滤器时日志仍然返回

java.lang.IndexOutOfBoundsException : Index: 1, 大小 : 0 at java. util.ArrayList.get(ArrayList.java:437)

java - IntelliJ/结构搜索 : Remove useless methods that only call super method