android - onPause - 尝试调用虚拟方法 WebView

标签 android webview onpause

当我使用事件onPause 和/或onResume 时,它不起作用-崩溃-。

public class xx extends Fragment {
    private WebView wv;
    private WebView wv2;
    public static final String TAG = "xx";


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.livewithchat, container, false);
        WebView wv = (WebView) rootView.findViewById(R.id.webView);
        WebSettings webSettings = wv.getSettings();
        webSettings.setJavaScriptEnabled(true);
        wv.loadUrl("XX");

        /* Chat */
        WebView wv2 = (WebView) rootView.findViewById(R.id.webView2);
        wv2.getSettings().setJavaScriptEnabled(true);
        wv2.getSettings().setSaveFormData(true);
        wv2.getSettings().setBuiltInZoomControls(false);
        wv2.setWebChromeClient(new WebChromeClient() {
            public void onProgressChanged(WebView view, int progress) {
            }
        });
        wv2.setWebViewClient(
                new WebViewClient(){
                    public boolean shouldOverrideUrlLoading(WebView view, String url){
                        view.loadUrl(url);
                        return false;
                    }
                });
        wv2.loadUrl("XX");
        wv2.addJavascriptInterface(new WebSocketFactory(wv2), "WebSocketFactory");


        return rootView;
    }

    @Override
    public void onResume()
    {
        super.onResume();
        wv.onResume();
        wv2.onResume();
    }
    @Override
    public void onPause()
    {
        super.onPause();
        wv.onPause();
        wv2.onPause();
    }

    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
        handler.proceed(); // Ignore SSL certificate errors
    }
}

日志:

07-05 20:37:46.313  11757-11757/com.clemb.test E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.clemb.test, PID: 11757
    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.webkit.WebView.onResume()' on a null object reference
            at com.clemb.test.livewithchat.onResume(livewithchat.java:68)
            at android.app.Fragment.performResume(Fragment.java:2192)
            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:956)
            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1115)
            at android.app.BackStackRecord.run(BackStackRecord.java:833)
            at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1580)
            at android.app.FragmentManagerImpl$1.run(FragmentManager.java:451)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:155)
            at android.app.ActivityThread.main(ActivityThread.java:5696)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)

我的 fragment :

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <WebView
        android:layout_width="match_parent"
        android:layout_height="228dp"
        android:id="@+id/webView" />

    <WebView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/webView2" />
</LinearLayout>

我已经尝试更改"private wv",但这并没有解决问题。

我在其他 Activity 中使用其他 webview(我想创建一个 WEB 应用程序),这是同样的问题。

我在 StackOverflow 中进行了搜索,但没有找到解决方案。

最佳答案

那是因为wvwv2是null,你将它们初始化为局部变量而不是使用实例变量,改变:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {


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

    /* Chat */
    WebView wv2 = (WebView) rootView.findViewById(R.id.webView2);

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {


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

    /* Chat */
    wv2 = (WebView) rootView.findViewById(R.id.webView2);

这样你就可以使用实例变量来阻止你获得 NullPointerExceptions。

更新

查看这篇文章,它对局部变量和实例变量之间的区别有相当好的解释 https://stackoverflow.com/a/2088370/1333516

关于android - onPause - 尝试调用虚拟方法 WebView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31233725/

相关文章:

android - 如何使用 onPause(后退按钮)发送结果 Intent

java - Android 保存 ArrayList<CustomObject> onPause 和 onSaveInstanceState

android - 假 KeyEvent 不能*完全*像 "real"按钮一样工作。为什么?

android - 更新 COSU 设备中的 Android 应用程序

webview - 在 Safari 中快速打开链接

windows - 如何在 UWP 上的 Xamarin.Forms WebView 中启用 WebGL?

javascript - 输入 iframe 在第二次点击 ionic v1 中停止在 IOS 上工作

android - 使用cordova和文件插件在android上强制使用外部sdcard

android - 在 Android 中接收 DTMF

java - 如何以编程方式为日历事件设置时区?