Is there a way to add an admob advert to a PreferenceActivity? How to?
ViewGroup viewGroup = (ViewGroup) findViewById(android.R.id.list).getParent().getParent().getParent();
viewGroup.addView(new AdView(...));
I implemented the proposed approach, but faced problem regarding placing the banner at the top and with padding issues. So, i used a different approach and interested to share with you. I was working on a preference activity, although it has been deprecated but i had to work on it for some reason instead of changing to androidx preference library.
Here are the following steps:
Get the parent of preference activity.
LinearLayout root = (LinearLayout)
findViewById(android.R.id.list).getParent().getParent().getParent();
Create a xml file named banner_ad.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:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.gms.ads.AdView
android:id="@+id/adview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
ads:adSize="SMART_BANNER"
ads:adUnitId="@string/banner_id" />
</LinearLayout>
Inflate the layout.
LinearLayout adViewLayout = (LinearLayout)
LayoutInflater.from(this).inflate(R.layout.banner_ad,root,false);
AdView adView = adViewLayout.findViewById(R.id.adview);
Load add.
AdRequest adRequest = new AdRequest.Builder()
.addTestDevice(device_id)
.build();
adView.loadAd(adRequest);
Add layout view as a child of root view. In my case i used this below toolbar at index 1.
root.addView(adViewLayout,1);
There is some changes to P.Melch answer in Adpreference class is like below (because its not working with latest google play ads library):
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);}
@Override
protected View onCreateView(ViewGroup parent) {
// this will create the linear layout defined in ads_layout.xml
View view = super.onCreateView(parent);
// the context is a PreferenceActivity
Activity activity = (Activity)getContext();
AdView adView = new AdView(getContext());
adView.setAdUnitId("<your ad id>");
adView.setAdSize(AdSize.BANNER);
AdRequest adRequest = new AdRequest.Builder().build();
adView.loadAd(adRequest);
((LinearLayout)view).addView(adView);
return view;
}
}
You just need to make a separate layout for ad and Add it to preference_screen.xml
as PreferenceCategory
.
You can see the clear picture in the attached images layout
preferenceScreen
Yes, a PreferenceActivity
is just a sub-class of ListActivity
and, as with ListActivity
, you can specify your own custom layout so long as it contains a ListView
with an ID of android.R.id.list
. So create whatever XML layout file you need containing a ListView
and an AdView
and use that layout for the PreferenceActivity
.
Dan Dyer's answer is correct. I would like to elaborate a bit, just to clarify by example.You can use a layout like this (called config.xml under res/layout).
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:myapp="http://schemas.android.com/apk/res/com.xxxx" android:layout_height="fill_parent"
android:layout_width="fill_parent">
<ListView android:id="@android:id/list" android:layout_width="fill_parent" android:layout_height="fill_parent"/>
<com.admob.android.ads.AdView
android:id="@+id/ad"
android:layout_alignParentBottom="true"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
myapp:backgroundColor="#000000"
myapp:primaryTextColor="#FFFFFF"
myapp:secondaryTextColor="#CCCCCC"/>
</RelativeLayout>
In your Activity that extends PreferenceActivity you write something like this in the onCreate method;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.config);
}