【发布时间】:2021-06-14 02:05:44
【问题描述】:
我想在我的应用程序的页面底部添加一个 AdMob 自适应横幅广告,但无论我做什么,我都无法让它正确显示。我加载广告没有问题(我的插页式广告也可以正常工作),但我永远无法让它正确定位。我已经尝试了一百万位代码和属性的组合,并查看了我在互联网上可以找到的所有内容,但无济于事。
我的代码分为三部分:
共享项目中的自定义视图,继承自 Frame 类(尽管互联网上有一些指导说要从 View 继承,但广告是完全不可见的,除非我从 Frame 继承)。
using Xamarin.Forms;
namespace MyApp.Views
{
public class AdAdaptiveBannerView : Frame
{
public AdAdaptiveBannerView()
{
}
}
}
Android 项目中的自定义渲染器。
using Android.Content;
using Android.Gms.Ads;
using Android.Widget;
using System;
using Xamarin.Essentials;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
[assembly: ExportRenderer(typeof(MyApp.Views.AdAdaptiveBannerView), typeof(MyApp.Droid.AdAdaptiveBanner_Droid))]
namespace MyApp.Droid
{
public class AdAdaptiveBanner_Droid : ViewRenderer<Views.AdAdaptiveBannerView, AdView>
{
public static AdView adView;
public AdAdaptiveBanner_Droid(Context context) : base(context)
{
}
private AdView CreateAdView()
{
adView = new AdView(Android.App.Application.Context)
{
AdUnitId = "ca-app-pub-3940256099942544/6300978111", //ca-app-pub-3940256099942544/6300978111 is a banner test unit.
LayoutParameters = new LinearLayout.LayoutParams(LayoutParams.WrapContent, LayoutParams.WrapContent), //For Adaptive Banner.
AdSize = AdSize.GetCurrentOrientationAnchoredAdaptiveBannerAdSize(Android.App.Application.Context, (int)(DeviceDisplay.MainDisplayInfo.Width / DeviceDisplay.MainDisplayInfo.Density))
//LayoutParameters = new LinearLayout.LayoutParams(LayoutParams.MatchParent, LayoutParams.WrapContent), //For SmartBanner.
//AdSize = AdSize.SmartBanner
};
adView.AdListener = new ListeningRegular();
adView.LoadAd(new AdRequest.Builder().Build());
return adView;
}
protected override void OnElementChanged(ElementChangedEventArgs<Views.AdAdaptiveBannerView> e)
{
base.OnElementChanged(e);
if (e.NewElement != null && Control == null) SetNativeControl(CreateAdView());
}
}
internal class ListeningRegular : AdListener
{
public override void OnAdLoaded()
{
Console.WriteLine("Ad has loaded.");
base.OnAdLoaded();
}
public override void OnAdClosed()
{
Console.WriteLine("Ad has closed.");
AdAdaptiveBanner_Droid.adView.Dispose();
AdAdaptiveBanner_Droid.adView = null;
AdAdaptiveBanner_Droid.adView.AdListener = null;
GC.Collect();
base.OnAdClosed();
}
}
}
以及共享项目中的内容页面 XAML(我将背景颜色设置为某种颜色,以便更轻松地查看正在发生的事情)。
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:views="clr-MyApp.Views"
x:Class="MyApp.Pages.Page1">
<ContentPage.Content>
<StackLayout>
<Grid VerticalOptions="EndAndExpand">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<views:AdAdaptiveBannerView BackgroundColor="DeepSkyBlue" />
</Grid>
</StackLayout>
</ContentPage.Content>
</ContentPage>
正如我所说,这可以正常加载广告,但它总是会裁剪掉广告的底部。除了看起来很傻,Google 的政策明确禁止这样做。
它还会随机决定何时打开页面以填充屏幕宽度或仅占用标准横幅广告宽度,如以下两张图片(取自运行 Android 7 的物理三星 Galaxy S6)。
和
我认为这可能是因为 GetCurrentOrientationAnchoredAdaptiveBannerAdSize 不知道设备的方向,并且在纵向和横向之间随机选择,但如果我使用 GetLandscapeAnchoredAdaptiveBannerAdSize 和 GetPortraitAnchoredAdaptiveBannerAdSize 取决于 DeviceDisplay.MainDisplayInfo.Orientation 它仍然随机选择。
如果我放弃尝试使用自适应横幅而改用智能横幅(通过取消注释上面第二段代码中的两行注释并注释掉上面的两行)它看起来一样糟糕,带有它周围有奇怪的边框。
它还会随机选择要加载的广告尺寸(即查看“这是一个 XxY 测试广告”的位置),尽管我认为这应该取决于屏幕宽度,因此应该始终相同。
我尝试将它放在各种容器中(例如网格,如上面的代码所示),但什么也没有。这篇文章已经够长了;如果我描述我尝试过的所有内容,那将是 50 页。
长期以来,我的印象是它与填充有关,因为它继承自 Frame(默认填充为 20),但没有填充组合(将其设置为 0 会使广告完全消失),边距、垂直选项、水平选项、行定义属性或任何帮助。
另外,我不知道如何让它对正在旋转的设备做出反应,所以这是另一个问题,因为当你旋转屏幕时它看起来不对(你只能设置一次 AdSize) .
有人可以帮忙吗?
编辑:我刚刚尝试以编程方式而不是在 XAML 中添加横幅广告,它给出了完全相同的结果。这太令人沮丧了。
【问题讨论】:
标签: android xamarin.forms admob ads banner