这是一个相当简单的布局,基本上是谷歌地图,下面有一个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
答案 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
的运作方式。