ClassCastException при интеграции объявлений AdMob в панель навигации

У меня возникла проблема с интеграцией рекламы Google AdMob в мое приложение. Я использую макет навигационного ящика, который выглядит так:

<FrameLayout
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<fragment
    android:id="@+id/navigation_drawer"
    android:name="pl.ntimobile.personalcoach.NavigationDrawerFragment"
    android:layout_width="@dimen/navigation_drawer_width"
    android:layout_height="match_parent"
    android:layout_gravity="start" />

Когда я буду размещать рекламу Google AdMob, ниже фрагмент, вот так:

(...)
android:layout_gravity="start" />

<com.google.android.gms.ads.AdView
    android:id="@+id/adView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    ads:adSize="BANNER"
    ads:adUnitId="@string/banner_ad_unit_id" >
</com.google.android.gms.ads.AdView>

And I initiate it properly in my class, it works perfectly, but ads are displayed 1) in the middle of the screen, and 2) above navigation drawer, so when I will show navigation drawer, I cannot click any of it's content. So when I am trying to put both ads and fragment in linear layout, I get ClassCastException... My layout looks like:

<FrameLayout
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <fragment
        android:id="@+id/navigation_drawer"
        android:name="pl.ntimobile.personalcoach.NavigationDrawerFragment"
        android:layout_width="@dimen/navigation_drawer_width"
        android:layout_height="match_parent"
        android:layout_gravity="start" />

    <com.google.android.gms.ads.AdView
        android:id="@+id/adView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        ads:adSize="BANNER"
        ads:adUnitId="@string/banner_ad_unit_id" >
    </com.google.android.gms.ads.AdView>
</LinearLayout>

И я получаю в своем логарифме:

10-01 11:13:53.325: E/AndroidRuntime(24113): FATAL EXCEPTION: main
10-01 11:13:53.325: E/AndroidRuntime(24113): java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.support.v4.widget.DrawerLayout$LayoutParams
10-01 11:13:53.325: E/AndroidRuntime(24113):    at android.support.v4.widget.DrawerLayout.isDrawerView(DrawerLayout.java:910)
10-01 11:13:53.325: E/AndroidRuntime(24113):    at android.support.v4.widget.DrawerLayout.isDrawerOpen(DrawerLayout.java:1156)
10-01 11:13:53.325: E/AndroidRuntime(24113):    at pl.company.appname.NavigationDrawerFragment.isDrawerOpen(NavigationDrawerFragment.java:79)
10-01 11:13:53.325: E/AndroidRuntime(24113):    at pl.company.appname.FragmentAMain.onCreateOptionsMenu(FragmentAMain.java:135)
10-01 11:13:53.325: E/AndroidRuntime(24113):    at android.app.Activity.onCreatePanelMenu(Activity.java:2578)
10-01 11:13:53.325: E/AndroidRuntime(24113):    at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:224)
10-01 11:13:53.325: E/AndroidRuntime(24113):    at android.support.v7.app.ActionBarActivity.superOnCreatePanelMenu(ActionBarActivity.java:232)
10-01 11:13:53.325: E/AndroidRuntime(24113):    at android.support.v7.app.ActionBarActivityDelegateICS.onCreatePanelMenu(ActionBarActivityDelegateICS.java:146)
10-01 11:13:53.325: E/AndroidRuntime(24113):    at android.support.v7.app.ActionBarActivity.onCreatePanelMenu(ActionBarActivity.java:199)
10-01 11:13:53.325: E/AndroidRuntime(24113):    at android.support.v7.app.ActionBarActivityDelegateICS$WindowCallbackWrapper.onCreatePanelMenu(ActionBarActivityDelegateICS.java:293)
10-01 11:13:53.325: E/AndroidRuntime(24113):    at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:507)
10-01 11:13:53.325: E/AndroidRuntime(24113):    at com.android.internal.policy.impl.PhoneWindow.doInvalidatePanelMenu(PhoneWindow.java:934)
10-01 11:13:53.325: E/AndroidRuntime(24113):    at com.android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.java:292)
10-01 11:13:53.325: E/AndroidRuntime(24113):    at android.os.Handler.handleCallback(Handler.java:730)
10-01 11:13:53.325: E/AndroidRuntime(24113):    at android.os.Handler.dispatchMessage(Handler.java:92)
10-01 11:13:53.325: E/AndroidRuntime(24113):    at android.os.Looper.loop(Looper.java:176)
10-01 11:13:53.325: E/AndroidRuntime(24113):    at android.app.ActivityThread.main(ActivityThread.java:5419)
10-01 11:13:53.325: E/AndroidRuntime(24113):    at java.lang.reflect.Method.invokeNative(Native Method)
10-01 11:13:53.325: E/AndroidRuntime(24113):    at java.lang.reflect.Method.invoke(Method.java:525)
10-01 11:13:53.325: E/AndroidRuntime(24113):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
10-01 11:13:53.325: E/AndroidRuntime(24113):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
10-01 11:13:53.325: E/AndroidRuntime(24113):    at dalvik.system.NativeStart.main(Native Method)

person Adam Staszak    schedule 01.10.2014    source источник
comment
Ваше добавление параметров макета программно? где это неправильно типизировано.   -  person Harsha Vardhan    schedule 01.10.2014
comment
Очистите и снова запустите код.   -  person Tushar Gogna    schedule 01.10.2014
comment
Мне кажется, проблема связана с тем, что ваш NavigationDrawerFragment находится в LinearLayout, а не связан с AdView. Проверьте свой код там.   -  person Rover Wanderer    schedule 01.10.2014
comment
Я ничего не делаю с этим линейным макетом — не добавляю в него никаких параметров. Код очистки тоже не помогает.   -  person Adam Staszak    schedule 01.10.2014


Ответы (2)


Хорошо понял. Я пытался (по моему мнению) разместить рекламу в LinearLayout с помощью NavigationDrawerFragment, а не с контейнером. Размещение рекламы с контейнером в RelativeLayout сделало свое дело:

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <com.google.android.gms.ads.AdView
        android:id="@+id/adView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        ads:adSize="BANNER"
        ads:adUnitId="@string/banner_ad_unit_id" >
    </com.google.android.gms.ads.AdView>

    <FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@id/adView" />
</RelativeLayout>

<fragment
    android:id="@+id/navigation_drawer"
    android:name="pl.ntimobile.personalcoach.NavigationDrawerFragment"
    android:layout_width="@dimen/navigation_drawer_width"
    android:layout_height="match_parent"
    android:layout_gravity="start" />

Работает так, как я хотел.

person Adam Staszak    schedule 01.10.2014

использовать

import android.widget.LinearLayout

вместо

import android.support.v4.widget.LinearLayout
person Shreenivas Chikati    schedule 01.10.2014
comment
android.support.v4.widget.LinearLayout ‹= такого класса нет в библиотеке поддержки - person Selvin; 01.10.2014