首页 > 解决方案 > Android警报对话框自定义视图与父高度不匹配

问题描述

我正在尝试通过单击警报对话框中的按钮打开 web 视图。一切正常,但我以编程方式创建的视图高度与警报对话框不匹配。

我的警报对话框代码是:

            AlertDialog.Builder alertBuilder = new AlertDialog.Builder(_context);
            AlertDialog alert = alertBuilder.Create();

            switch (_type)
            {
                case ButtonType.PdfButton:
                    //open pdf
                    if (_pdfUrlType)
                        alert.SetView(PdfHandler(alert));
                    break;

                default:
                    break;
            }

            alert.Show();
            alert.Window.SetLayout(700, 1800);
        }
        catch (Exception ex)
        {
        }
        finally 
        {
        }

我正在调用调用 URL pdf 的 pdf 处理程序

    private FrameLayout PdfHandler(AlertDialog dialog) 
    {
        if (_pdfUrlType)
        {
           return GenerateUrlPdf(dialog);
        }
    }

下面是 generateurlpdf 的代码

    private FrameLayout GenerateUrlPdf(AlertDialog dialog) 
    {

        FrameLayout layout = new FrameLayout(_context);

        FrameLayout.LayoutParams lpMatchParent = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MatchParent, FrameLayout.LayoutParams.MatchParent);
        //layout.LayoutParameters = lpMatchParent; // i applied this on frame layout but didn't work out
       // I also tried to get alertdialog height during runtime but it shows zero bcz its isn't made yet

        var loader = GenerateLoaderGif();
        var webView = GenerateWebView(loader);

        layout.AddView(webView, lpMatchParent);
        layout.AddView(loader, lpMatchParent);

        return layout;
    }

loader 和 webview 代码如下

    private WebView GenerateWebView(LinearLayout _loader) 
    {
        WebView _view = new WebView(Application.Context);
        ((WebView)_view).Settings.JavaScriptEnabled = true;
        ((WebView)_view).Settings.SetAppCacheEnabled(true);
        ((WebView)_view).Settings.SetAppCacheMaxSize(long.MaxValue);
        ((WebView)_view).Settings.AllowFileAccess = true;
        ((WebView)_view).Settings.CacheMode = CacheModes.CacheElseNetwork;
        ((WebView)_view).LoadUrl("https://docs.google.com/gview?url=" + _url);
        return _view;
    }

    private LinearLayout GenerateLoaderGif()
    {
        LinearLayout _loader = new LinearLayout(_context);
        GifImageView GifView = new GifImageView(_context);
        LinearLayout.LayoutParams loaderparams = new LinearLayout.LayoutParams(150, 150);
        loaderparams.Gravity = GravityFlags.Center;

        _loader.SetGravity(GravityFlags.Center);
        _loader.SetBackgroundColor(Color.ParseColor("#9B000000"));

        Stream input = _context.Resources.OpenRawResource(Resource.Drawable.loadingGif);

        GifView.SetBytes(Common.ConvertStreamToByte(input));
        GifView.StartAnimation();

        _loader.AddView(GifView, loaderparams);

        return _loader;
    }

当加载器完成加载时,webview 也显示在 150 像素的有限区域中,我仅将 150 像素应用于作为框架布局子级的线性布局。

在调试时我看到 webview 和 loader 的高度都是 150 像素。

下面是活动截图

Alertdialog setview 问题

标签: androidxamarin.androidandroid-alertdialog

解决方案


尝试像下面这样改变,如果它的效果,你想要吗?

 private FrameLayout GenerateUrlPdf(AlertDialog dialog)
    {

        FrameLayout layout = new FrameLayout(this);

        FrameLayout.LayoutParams lpMatchParent = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MatchParent,FrameLayout.LayoutParams.MatchParent);
        //layout.LayoutParameters = lpMatchParent; // i applied this on frame layout but didn't work out
        // I also tried to get alertdialog height during runtime but it shows zero bcz its isn't made yet

        var loader = GenerateLoaderGif();
        var webView = GenerateWebView(loader);
        //webView.LayoutParameters = lpMatchParent;
        layout.AddView(webView);
        layout.AddView(loader);


        return layout;
    }
   
    private LinearLayout GenerateLoaderGif()
    {
        LinearLayout _loader = new LinearLayout(this);
        ImageView GifView = new ImageView(this);
        LinearLayout.LayoutParams loaderparams = new LinearLayout.LayoutParams(150, 150);
        loaderparams.Gravity = GravityFlags.Center;

        _loader.SetGravity(GravityFlags.Center);
        _loader.SetBackgroundColor(Color.ParseColor("#9B000000"));



        GifView.SetImageResource(Resource.Drawable.fivePlus);

        _loader.LayoutParameters = loaderparams;
        _loader.AddView(GifView);

        return _loader;
    }

效果(我只是用 ImageView 而不是 GifImageView 测试):

在此处输入图像描述


推荐阅读