java - 在 WebView 加载之前替换 fragment 时应用程序崩溃

标签 java android android-fragments webview

我的应用程序使用抽屉导航,并在抽屉中进行选择时替换我的主要 Activity 中的 fragment 。我有几个显示 WebView 的 fragment 。如果我打开抽屉并选择不同的项目,从而在 web View 中的页面完成加载之前将 fragment 替换为 web View ,则会出现问题。发生这种情况时,我会收到此错误:

12-02 08:07:48.605  11745-11745/kyfb.android.kyfb.com.kyfb A/chromium﹕ [FATAL:jni_android.cc(271)] Check failed: false.
12-02 08:07:48.605  11745-11745/kyfb.android.kyfb.com.kyfb A/libc﹕ Fatal signal 6 (SIGABRT), code -6 in tid 11745 (d.kyfb.com.kyfb)

这是带有 WebView 的 fragment 之一。

public class AnnualMeetingFragment extends Fragment {

    private WebView web;
    private ProgressBar progressBar;

    private String url;

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        View rootView = inflater.inflate(R.layout.fragment_ag_facts, null);

        url = "http://www.kyfbnewsroom.com/2013-kentucky-farm-bureau-annual-meeting-program/";

        web = (WebView)rootView.findViewById(R.id.web);
        progressBar = (ProgressBar)rootView.findViewById(R.id.prgPageLoading);

        web.getSettings().setDomStorageEnabled(true);
        web.getSettings().setJavaScriptEnabled(true);
        web.getSettings().setSupportZoom(true);
        web.getSettings().setBuiltInZoomControls(true);
        web.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH);
        web.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
        web.getSettings().setDefaultZoom(WebSettings.ZoomDensity.FAR);

        web.loadUrl(url);

        web.setWebChromeClient(new WebChromeClient() {
            public void onProgressChanged(WebView webView, int progress) {
                getActivity().setProgress(progress * 100);
                progressBar.setProgress(progress);
            }
        });

        web.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(web, url, favicon);
                progressBar.setVisibility(View.VISIBLE);
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(web, url);
                progressBar.setProgress(0);
                progressBar.setVisibility(View.GONE);
            }

            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                Toast.makeText(getActivity(), description, Toast.LENGTH_SHORT).show();
            }

            public boolean shouldOverrideUrlLoading(WebView view, String url)
            {


                if(url.endsWith(".mp4") || url.endsWith(".3gp") || url.endsWith(".avi") || url.endsWith(".flv")){
                    Intent i = new Intent(Intent.ACTION_VIEW);
                    i.setData(Uri.parse(url));
                    startActivity(i); //warning no error handling will cause force close if no media player on phone.
                    return true;
                }

                view.loadUrl(url);
                return true;
            }
        });

        return rootView;
    }
}

最佳答案

我不确定您为什么会收到此错误,我认为它应该类似于 NullPointerException。 接下来尝试: 每当您在 Fragment 实例上调用 getActivity() 时,您应该确定该 fragment 实际上有这个 Activity。因为当您的 webview 正在加载时,您正在调用此函数:

web.setWebChromeClient(new WebChromeClient() {
        public void onProgressChanged(WebView webView, int progress) {
            getActivity().setProgress(progress * 100);
            progressBar.setProgress(progress);
        }
    });

我觉得你应该替换所有调用 getActivity() 的代码:

Activity activity = getActivity();
if (activity != null) {
    // do something
}

试试这个,然后告诉我它是否有效。

关于java - 在 WebView 加载之前替换 fragment 时应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27250476/

相关文章:

java - 制作带有标题和标签的对话框

java - 为什么这个正则表达式在 Java 中这么慢?

java - Eclipse 在 jsp 中使用类

android - setAlarmClock 在 android marshmallow 中不准确

java - Android (Java) HTTP POST JSON 到服务器,但服务器告诉我没有看到 POST 变量

android - 如何在Android中从Fragment传递Context对象?

java - 如何在 ViewPager 中仅查看部分 Fragment

java - 在什么情况下trimToSize()方法不会影响Java中StringBuffer类的capacity()方法返回的值?

android - 如何在线性布局中将 TextView 定位在 ListView 上方

java - 从细节部分刷新Android Master/Detail Flow的Master page