如何使用 LinearLayout 的高度设置 FrameLayout 的边距

How to set the margin of a FrameLayout with the height a LinearLayout

我正在我的应用程序中展示 admob 广告,我想做的是使用 advert_container 的高度来设置 book_framemarginBottom

这些是我的布局;

activity_book

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:ads="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <include layout="@layout/book_toolbar"/>

    <include layout="@layout/share_layout"/>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:orientation="vertical"
        android:visibility="gone"
        android:background="#777777"
        android:id="@+id/advert_container"
        android:layout_centerHorizontal="true">
        <View
            android:layout_width="match_parent"
            android:layout_height="15dp"
            android:background="#777777"
            android:id="@+id/dviewtop"/>

        <com.google.android.gms.ads.AdView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/banner_id"
            ads:adSize="SMART_BANNER"
            ads:adUnitId="ca-app-pub-XXXXXXXXXXXXXXXXXXXXXXXXX"/>
    </LinearLayout>

</RelativeLayout>

book_toolbar

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".BookActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/book_toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|enterAlways"
            app:popupTheme="@style/AppTheme.PopupOverlay"/>

    </android.support.design.widget.AppBarLayout>

    <FrameLayout
        android:id="@+id/book_frame"
        android:layout_width="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        android:layout_height="match_parent"/> 
</android.support.design.widget.CoordinatorLayout>

这是我的 activity:

BookActivity

//I skipped a lot a of codes that's not necessary

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d(TAG, "onCreate called");
    setContentView(R.layout.activity_book);
    mToolbar = (Toolbar) findViewById(R.id.book_toolbar);
    mFragLayout = (FrameLayout) findViewById(R.id.book_frame);
    advertCont = (LinearLayout) findViewById(R.id.advert_container);

    adView = (AdView) findViewById(R.id.banner_id);

    AdRequest adRequest = new AdRequest.Builder()
            .addTestDevice("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")
            .build();
    adView.loadAd(adRequest);

    ViewTreeObserver observer = advertCont.getViewTreeObserver();
    observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            adHeight = adView.getMeasuredHeight();
            Log.d(TAG, "The height of the advertL is " + adHeight);
            if (adHeight > 1) {
                FrameLayout.LayoutParams params = (FrameLayout.LayoutParams)mFragLayout.getLayoutParams();
                params.setMargins(0, 0, 0, adHeight);
                mFragLayout.setLayoutParams(params);
            }
        }
    });
}

问题是它抛出 ClassCastException 异常。

堆栈跟踪

06-17 13:59:56.637 31869-31869/com.ozuf.bookhistory E/AndroidRuntime: FATAL EXCEPTION: main
                                                                     Process: com.ozuf.bookhistory, PID: 31869
                                                                     java.lang.ClassCastException: android.support.design.widget.CoordinatorLayout$LayoutParams cannot be cast to android.widget.FrameLayout$LayoutParams
                                                                         at com.ozuf.bookhistory.BookActivity.onGlobalLayout(BookActivity.java:87)
                                                                         at android.view.ViewTreeObserver.dispatchOnGlobalLayout(ViewTreeObserver.java:912)
                                                                         at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1911)
                                                                         at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1073)
                                                                         at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5988)
                                                                         at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
                                                                         at android.view.Choreographer.doCallbacks(Choreographer.java:580)
                                                                         at android.view.Choreographer.doFrame(Choreographer.java:550)
                                                                         at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
                                                                         at android.os.Handler.handleCallback(Handler.java:739)
                                                                         at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                         at android.os.Looper.loop(Looper.java:135)
                                                                         at android.app.ActivityThread.main(ActivityThread.java:5910)
                                                                         at java.lang.reflect.Method.invoke(Native Method)
                                                                         at java.lang.reflect.Method.invoke(Method.java:372)
                                                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405)
                                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200)

从堆栈跟踪来看,第 87 行是 FrameLayout.LayoutParams params = (FrameLayout.LayoutParams)mFragLayout.getLayoutParams();

请问有解决办法吗?

尝试更改

FrameLayout.LayoutParams params = 
(FrameLayout.LayoutParams)mFragLayout.getLayoutParams(); 

CoordinatorLayout.LayoutParams params = 
(CoordinatorLayout.LayoutParams)mFragLayout.getLayoutParams(); 

This is because coordinator layout is the parent layout and you need to set layout params of the parent.

LayoutPrams 使用最顶层视图当前视图的父视图...

使用这个

CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams)mFragLayout.getLayoutParams();

而不是这个

FrameLayout.LayoutParams params = (FrameLayout.LayoutParams)mFragLayout.getLayoutParams();

享受编码...