AdView移动到替换片段之上

时间:2016-01-19 12:49:34

标签: android android-fragments adview

这是一个相当简单的布局,基本上是谷歌地图,下面有一个AdView。当我替换整个布局(使用FragmentManager)时,AdView仍然可见并移动到屏幕顶部。为什么AdView仍然可见?它不应该像MapFragment一样被替换吗?

activity_main.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/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <fragment xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/map"
        android:name="com.google.android.gms.maps.MapFragment"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <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_ad_unit_id" />
</LinearLayout>

MainActivity.java

getFragmentManager().beginTransaction()
                        .replace(R.id.container, new SettingsFragment())
                        .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                        .addToBackStack(null)
                        .commit();

底部的AdView

AdView at bottom

顶部的AdView

AdView at top

1 个答案:

答案 0 :(得分:1)

这基本上是因为FragmentManager有点奇怪。使用片段时要记住:

  

永远不应该替换通过XML布局创建的碎片。

如果您需要替换活动中的片段,则应使用Java中的所有片段。像这样:

@Override
public void onCreate(Bundle state){
    super.onCreate(state);
    setContentView(R.layout...);
    if(state == null){
        getFragmentManager()... add initial fragment
    }
}

private void moveToNextFrag(){
     getFragmentManager()
            .beginTransaction()
            .replace(R.id.container, new SettingsFragment())
            .... etc...etc
}

我知道这很奇怪但是FragmentManager的运作方式。