带有空白白屏的 WebView

2024-06-01

我在 DialogFragment 中有一个 webview,它使用以下方式显示文档和 PDF它可以进行几次尝试,但如果用户尝试频繁打开和关闭对话框,webview 将显示空白屏幕

我已经尝试了所有的线程link1 https://stackoverflow.com/questions/14300664/android-webview-displaying-blank-page link2 https://stackoverflow.com/questions/30391356/android-webview-with-http-loadurl-shows-blank-empty-page与此问题相关的问题没有人解决

我的情况是,当我连续多次尝试时它停止工作

  public class FileViewDialog extends DialogFragment implements 
   View.OnClickListener {
    private static final String TAG = "FileViewDialog";
    private static final String PARAM_1  = "param_one";
    private static final String PARAM_2  = "param_two";
    private static final String PARAM_3  = "param_three";

    private ArrayList<ImageListItem> imagesList = new ArrayList<>();
    private CustomViewPager viewPager;
    private View rlDelete, rlReplace ,rlDownload;
    private int currentItem = 0;
    private LinearLayout llIndicators ;
    private FileViewDialog.FileViewDialogContract dialogContract;
    private boolean isAttachment;
    private AdaptiveTableLayout adaptiveTableLayout;
    private View csvView;
    private WebView webView;
    private TextView tvInfo;
    private long downloadRef;
    String fileUrl;
    private ProgressBar progressBarWeb;
    private ProgressBar progressBar;

    public static FileViewDialog getInstance(ArrayList<ImageListItem> imagesList, int currentItem, boolean isAttachment) {
        FileViewDialog videoPlayerDialog = new FileViewDialog();
        Bundle argument = new Bundle();
        argument.putParcelableArrayList(PARAM_1, imagesList);
        argument.putInt(PARAM_2, currentItem);
        argument.putBoolean(PARAM_3, isAttachment);
        videoPlayerDialog.setArguments(argument);
        return videoPlayerDialog;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            imagesList = getArguments().getParcelableArrayList(PARAM_1);
            currentItem = getArguments().getInt(PARAM_2);
            isAttachment = getArguments().getBoolean(PARAM_3);
        }
        fileUrl = imagesList.get(currentItem).getImageUrl();
        setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar);
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        getDialog().getWindow().getAttributes().windowAnimations = R.style.CustomDialog;
    }

    @Override
    public void onStart() {
        super.onStart();
        Dialog dialog = getDialog();
        if (dialog != null)
        {
            int width = ViewGroup.LayoutParams.MATCH_PARENT;
            int height = ViewGroup.LayoutParams.MATCH_PARENT;
            dialog.getWindow().setLayout(width, height);
        }
    }


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_file_view, container);
    }
    private boolean isCSVFile(final String imageURL) {
        return imageURL != null && imageURL.contains(".csv");
    }




    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
        View rlBack = view.findViewById(R.id.rlBack);
        rlBack.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dismiss();
            }
        });
        progressBar = view.findViewById(R.id.csv_loading);
        webView = view.findViewById(R.id.webviewFile);
        tvInfo = view.findViewById(R.id.tvFileInfo);
        progressBarWeb = view.findViewById(R.id.loader);
        webView.setVisibility(isCSVFile(fileUrl) ? View.GONE : View.VISIBLE);
        webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
        Utils.setOnClickListener(this, rlDelete, rlReplace, rlDownload);
        llIndicators = view.findViewById(R.id.llIndicators);
        inflateIndicators(currentItem, llIndicators);
        if (fileUrl == null) {
            webView.setVisibility(View.GONE);
            tvInfo.setVisibility(View.VISIBLE);
            tvInfo.setText(R.string.msg_file_error);
        }
        removeAllCookies(getContext());
        progressBarWeb.setVisibility(View.VISIBLE);
        webView.setWebViewClient(new MyBrowser());

        // To be used for Telling that we are Loading
        webView.getSettings().setJavaScriptEnabled(true);
        try {
            fileUrl = URLEncoder.encode(fileUrl, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        webView.loadUrl("http://drive.google.com/viewerng/viewer?embedded=true&url=" + fileUrl);

    }

    private void inflateIndicators(int position, LinearLayout llIndicators) {

        llIndicators.removeAllViews();

        int pixels = Utils.convertDpToPixels(getActivity(), 8);
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(pixels, pixels);

        for (int index = 0; index < imagesList.size(); index++) {
            View view = new View(getActivity());
            view.setLayoutParams(params);
            view.setBackgroundResource(index == position ? R.drawable.switcher_filled : R.drawable.switcher);
            llIndicators.addView(view);
        }
    }




    @TargetApi(Build.VERSION_CODES.N)
    private class MyBrowser extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest url) {
            view.loadUrl(url.getUrl().toString());
            return true;
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            webView.setVisibility(View.VISIBLE);
            progressBarWeb.setVisibility(View.GONE);
            super.onPageFinished(view, url);
        }


    }
    private static void removeAllCookies(final Context context) {
      //On Lollipop and beyond, the CookieManager singleton works fine by itself.
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            CookieSyncManager.createInstance(context);
        }
        final CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.removeAllCookie();
    }

}

这是在嵌入的谷歌文档网址中渲染 pdf 网址时空白页面加载问题的解决方案。

@Override
public void onPageFinished(WebView view, String url) {
    super.onPageFinished(view, url);
        if (view.getTitle().equals(""))
        view.reload();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带有空白白屏的 WebView 的相关文章

随机推荐