2014-03-28 26 views
0

帮助我,stackoverflow,你是我唯一的希望。我想创建一个Android动态壁纸,在壁纸的偏好活动中显示广告。我几乎被下面这个例子中得到了这个工作:Android:AdView并不总是通过CreateView在首选项中显示

Android Admob advert in PreferenceActivity

这工作得很好,但是这个示例使用OnCreateView()来加载广告。我注意到,OnCreateView被多次调用自定义广告偏好设置。即使您在首选项列表中滚动,也会发生这种情况,因此AdRequest会一次又一次地被触发。这个问题也被这里提到:

AdView requests new add every time SeekBar is touched

所以我感动的呼吁在AdRequest到onAttachedToHierarchy(),并使用一个成员变量来存储的AdView。然后,我使用存储的adView将其添加到OnCreateView()中的视图中 - 但是,这会导致一种奇怪的行为:广告重新加载已停止,但广告仅在“有时”列表顶部显示优先。例如,当我加载首选项时,广告未被显示。我向下滚动,然后又突然,广告在那里。再次下降,再次快速上升,广告消失了。闲聊:广告再次出现。调试表明,从OnCreateView()的一些多次调用中,有一些“成功”,并且广告得到显示,有些则不成功。看起来,它需要一个“成功”的调用发生在OnCreateView()的最后一次调用,因此广告停留在屏幕上。 我需要做些什么才能确保adView始终正确显示?在首选项屏幕中显示广告可能有不同的方法吗?

我的代码如下:

的喜好来显示广告:

public class AdPreference extends Preference { 

public AdPreference(Context context, AttributeSet attrs, int defStyle) {super (context, attrs, defStyle);} 
public AdPreference(Context context, AttributeSet attrs) {super(context, attrs);} 
public AdPreference(Context context) {super(context);} 

/** The view to show the ad. */ 
private AdView adView; 

/* Your ad unit id. Replace with your actual ad unit id. */ 
private static final String AD_UNIT_ID = "XXXXXXXXXXXXXXX"; 

@Override 
public void onAttachedToHierarchy(PreferenceManager preferenceManager){ 
    super.onAttachedToHierarchy(preferenceManager); 

    Activity activity = (Activity)getContext(); 

    // Create an adView. 

    adView = new AdView(activity); 
    adView.setAdSize(AdSize.BANNER); 
    adView.setAdUnitId(AD_UNIT_ID); 

    // Create an ad request. Check logcat output for the hashed device ID to 
    // get test ads on a physical device. 
    AdRequest adRequest = new AdRequest.Builder() 
     .addTestDevice(AdRequest.DEVICE_ID_EMULATOR) 
     .build(); 

    // Start loading the ad in the background. 
    adView.loadAd(adRequest); 
} 

@Override 
protected View onCreateView(ViewGroup parent) { 
    // this will create the linear layout defined in ads_layout.xml 
    View view = super.onCreateView(parent); 

    if (adView.getParent()!=null) 
    { 
     ((LinearLayout)adView.getParent()).removeAllViews(); 
    } 
    ((LinearLayout)view).addView(adView); 

    return view;  
} 

} 

片段偏好的XML:

<?xml version="1.0" encoding="UTF-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:examplens="http://example.com"> 
<example.AdPreference  android:layout="@layout/ad_preference" /> 
<Preference android:title="@string/preference1" /> 
    . 
    . 
    . 
<PreferenceCategory> 

</PreferenceCategory> 

布局XML的广告偏好:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:ads="http://schemas.android.com/apk/res-auto" 
android:id="@+id/linearLayoutForAd" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:orientation="vertical" > 
</LinearLayout> 

请让我知道如果问题描述不清楚,你需要更多的代码/信息!提前致谢!

回答

0

我通过做一个小小的改变来实现它:诀窍是缓存整个“LinearLayout” - 查看而不是缓存AdView。对于AdPreference的代码更改为:

public class AdPreference extends Preference { 

public AdPreference(Context context, AttributeSet attrs, int defStyle) {super (context, attrs, defStyle);} 
public AdPreference(Context context, AttributeSet attrs) {super(context, attrs);} 
public AdPreference(Context context) {super(context);} 

/** The view to show the ad. */ 
private static AdView adView; 
private static View myCustomView; 

/* Your ad unit id. Replace with your actual ad unit id. */ 
private static final String AD_UNIT_ID = "XXXXXXXXXXXXXXX"; 

@Override 
protected View onCreateView(ViewGroup parent) { 
    // this will create the linear layout defined in ads_layout.xml 

    if (myCustomView==null) 
    { 

     View view = super.onCreateView(parent); 

     Activity activity = (Activity)getContext(); 

     // Create an adView. 

     adView = new AdView(activity); 
     adView.setAdSize(AdSize.BANNER); 
     adView.setAdUnitId(AD_UNIT_ID); 
     //adView. 

     ((LinearLayout)view).addView(adView); 

     myCustomView = view; 

     // Create an ad request. Check logcat output for the hashed device ID to 
     // get test ads on a physical device. 
     AdRequest adRequest = new AdRequest.Builder() 
      .addTestDevice(AdRequest.DEVICE_ID_EMULATOR) 
      .build(); 

     // Start loading the ad in the background. 
     adView.loadAd(adRequest); 

    } 
    return myCustomView;  
} 

} 

这使它成为我工作打算,没有永久的广告重载以及广告仍然在首选项列表“稳定”。

0

不要在首选项中显示广告。这真的是糟糕的用户体验。 PreferenceActvity机制没有很好的设置来处理它。

您的用户在您的偏好设置屏幕上花费多长时间? 改为将广告放在应用的主体中。

+1

感谢您的回复!通常我会尽量避免在首选项中显示广告,但应用程序是一个**安卓动态壁纸**,所以没有“主体”或用户界面来处理...并在墙纸中显示广告本身对用户来说会更糟糕:-(。 如果您的评论更像是“将偏好列表中的广告放在偏好设置屏幕之外”,您能否告知我们如何去做?我很乐意采用这种方法,但我不知道这是如何在Android PreferenceFragment的环境下工作的,因为它似乎在显示时带来了自己的布局。 – MrWagoner

+1

对不起,我不认为你可以做你想做的事。说实话,我不确定你花时间进行投资是否值得(甚至可以开展工作)。除非您有上千万的用户经常更改设置,否则您将看到在短时间内显示的广告的点击次数很少,您可能看到的收入极少。 – William

+0

感谢您再次回复!对于您对广告收入的估算,我完全同意您的看法:我也不希望在广告上看到很多点击。尽管如此,我还是想做广告整合,因为我想在更大型的项目中使用它之前,更多地了解AdMob集成的细节。 在技术方面,我现在通过缓存整个LinearLayout而不是AdView来查看答案。再次感谢您的想法和您的考虑! – MrWagoner

相关问题