代码之家  ›  专栏  ›  技术社区  ›  Señor Reginold Francis

Android WebView加载对话框未被取消

  •  5
  • Señor Reginold Francis  · 技术社区  · 16 年前

    我使用以下代码

    class CustomWebViewClient extends WebViewClient {
        Context context;
        ProgressDialog pd = null;
    
    
        public CustomWebViewClient (Context c){
            context = c;
        }
    
        public void onPageFinished(WebView view, String url){
            pd.dismiss();
        }
    
    
    
        public boolean shouldOverrideUrlLoading(final WebView view, final String url) {
            pd = ProgressDialog.show(context, "", "pageload. Please wait...", true);
    
    
            view.loadUrl(url);  
    
            return true;
        } 
    
    }
    

    当我单击WebView中的链接时,对话框出现,页面开始加载,但是当页面加载完成时,对话框仍在屏幕上。显然,代码足够简单,但我无法理解。另外,我想我应该补充一下,被点击的链接有一些重定向,但我不确定这是否与这里的原因有关。

    我该怎么做?

    4 回复  |  直到 10 年前
        1
  •  3
  •   statosdotcom    10 年前

    Steven&Sander,尝试在处理程序中取消进度对话框

    像这样:

      class pdHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
          if(pd != null)
          {
          pd.dismiss();
          pd = null;
          }
        }
    

    然后在onpageFinished中调用处理程序:

     public void onPageFinshed(WebView view, String url){
            pdHandler.sendEmptyMessage(0);
        }
    

    &你完了!

        2
  •  3
  •   Sergey Glotov Nitesh Khosla    15 年前

    你错过了 @Override 注释。

    这是正确的代码:

    class CustomWebViewClient extends WebViewClient {
        Context context;
        ProgressDialog pd = null;
    
        public CustomWebViewClient(Context c){
            context = c;
        }
    
        @Override
        public void onPageFinished(WebView view, String url){
            if (pd != null && pd.isShowing())
            {
                pd.dismiss();
            }
        }
    
        @Override
        public boolean shouldOverrideUrlLoading(final WebView view, final String url) {
            pd = ProgressDialog.show(context, "", "pageload. Please wait...", true);
            view.loadUrl(url);  
            return true;
        } 
    }
    

    此代码有效,但初始加载时不显示进度对话框。如果需要,请将此代码添加到类的构造函数:

    pd = ProgressDialog.show(context, "", "pageload. Please wait...", true);
    
        3
  •  1
  •   Shaun    14 年前

    这行得通, 你拼写错误,你写了“onpagefinshed”

        4
  •  1
  •   iAndroid    14 年前
    public class WebDialog extends Dialog
    {
    
        static final int                      BLUE                  = 0xFF6D84B4;
        static final float[]                  DIMENSIONS_DIFF_LANDSCAPE =
                                                                        { 20, 60 };
        static final float[]                  DIMENSIONS_DIFF_PORTRAIT  =
                                                                        { 40, 60 };
        static final FrameLayout.LayoutParams   FILL                    = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT);
        static final int                      MARGIN                    = 4;
        static final int                      PADDING                   = 2;
        static final String                   DISPLAY_STRING            = "touch";
    
        private String                        mUrl;
    //  private DialogListener                mListener;
        private ProgressDialog                mSpinner;
        private WebView                       mWebView;
        private LinearLayout                  mContent;
        private TextView                      mTitle;
    
        public WebDialog(Context context, String url)
        {
            super(context);
            mUrl = url;
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            mSpinner = new ProgressDialog(getContext());
            mSpinner.requestWindowFeature(Window.FEATURE_NO_TITLE);
            mSpinner.setMessage("Loading...");
    
            mContent = new LinearLayout(getContext());
            mContent.setOrientation(LinearLayout.VERTICAL);
            setUpTitle();
            setUpWebView();
            Display display = getWindow().getWindowManager().getDefaultDisplay();
            final float scale = getContext().getResources().getDisplayMetrics().density;
            int orientation = getContext().getResources().getConfiguration().orientation;
            float[] dimensions = (orientation == Configuration.ORIENTATION_LANDSCAPE) ? DIMENSIONS_DIFF_LANDSCAPE : DIMENSIONS_DIFF_PORTRAIT;
            addContentView(mContent, new LinearLayout.LayoutParams(display.getWidth() - ((int) (dimensions[0] * scale + 0.5f)), display.getHeight() - ((int) (dimensions[1] * scale + 0.5f))));
        }
    
        private void setUpTitle()
        {
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            Drawable icon = getContext().getResources().getDrawable(R.drawable.ic_launcher);
            mTitle = new TextView(getContext());
            mTitle.setText("Website");
            mTitle.setTextColor(Color.WHITE);
            mTitle.setTypeface(Typeface.DEFAULT_BOLD);
            mTitle.setBackgroundColor(BLUE);
            mTitle.setPadding(MARGIN + PADDING, MARGIN, MARGIN, MARGIN);
    //      mTitle.setCompoundDrawablePadding(MARGIN + PADDING);
    //      mTitle.setCompoundDrawablesWithIntrinsicBounds(icon, null, null, null);
            mContent.addView(mTitle);
        }
    
        private void setUpWebView()
        {
            mWebView = new WebView(getContext());
            mWebView.setVerticalScrollBarEnabled(false);
            mWebView.setHorizontalScrollBarEnabled(false);
            mWebView.setWebViewClient(new WebDialog.DialogWebViewClient());
            mWebView.getSettings().setJavaScriptEnabled(true);
    
            System.out.println(" mURL = "+mUrl);
    
            mWebView.loadUrl(mUrl);
            mWebView.setLayoutParams(FILL);
            mContent.addView(mWebView);
        }
    
        private class DialogWebViewClient extends WebViewClient
        {
    
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url)
            {
                view.loadUrl(url);
    
                return true;
            }
    
            @Override
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)
            {
                super.onReceivedError(view, errorCode, description, failingUrl);
                WebDialog.this.dismiss();
            }
    
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon)
            {
                super.onPageStarted(view, url, favicon);
                mSpinner.show();
            }
    
            @Override
            public void onPageFinished(WebView view, String url)
            {
                super.onPageFinished(view, url);
                String title = mWebView.getTitle();
                if (title != null && title.length() > 0)
                {
                    mTitle.setText(title);
                }
                mSpinner.dismiss();
            }
    
        }
    }