Search code examples
androidxamarin.androidandroid-alertdialog

Android Alert Dialog custom view not matching parent height


I am trying to open a webview from a button click in a alert dialog. everything works but the height of the view which I have created programmatically is not matching alert dialog.

my alert dialog code is:

            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 
        {
        }

and I am calling pdf handler which calls URL pdf

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

below is code for 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 and webview code is given below

    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;
    }

when the loader is finished loading webview is also shown in a limited area of 150 pixel i am only applying 150 pixel to a linear layout which is a child of framelayout.

on debugging i get to see that the height of webview and loader both are 150 pixel.

below is screenshot of activity

Alertdialog setview problem


Solution

  • Try to change like below,if its effect,you want ?

     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;
        }
    

    the effect (i just test with ImageView instead of GifImageView):

    enter image description here