【问题标题】:Android Alert Dialog custom view not matching parent heightAndroid警报对话框自定义视图与父高度不匹配
【发布时间】:2020-11-04 14:13:34
【问题描述】:

我正在尝试通过单击警报对话框中的按钮打开 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 problem

【问题讨论】:

    标签: android xamarin.android android-alertdialog


    【解决方案1】:

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

     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 测试):

    【讨论】:

    • 我对其进行了测试,它对我有用。我会再次检查。
    • 我正在更改使用框架布局制作自定义警报弹出窗口的实现,因为我还需要控制弹出窗口的位置,但如果您的代码有效,我将测试并接受您的答案,但我不是不再实现警报对话框
    • 如果它对你有用,那么代码中可能还有其他问题
    • 好的,你可以查看上面的更新,如果你想要的效果?
    • 你能告诉我你是如何在警报对话框中添加这个视图的代码
    猜你喜欢
    • 2015-04-13
    • 2012-10-28
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多