FragmentTransaction replace()方法只替换布局中的一些元素

时间:2015-02-11 02:40:37

标签: java android android-layout android-fragments android-5.0-lollipop

所以我有一个活动处理片段转换来替换不同的布局。我最初在onCreated()方法中替换了我的登录片段布局,然后当登录片段调用我的活动中的监听器方法时,我尝试用我的贴图片段布局替换它。我的登录布局显示正常但是当我切换到地图布局时,一半的登录按钮和字段仍然在屏幕上与地图活动重叠。我的容器里有洞吗?

的活动:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main_layo);
    fm = getFragmentManager();
    if (lf == null) {
        if (savedInstanceState != null) {
            lf = (LoginFragment) fm.findFragmentByTag("Login");
            return;
        }
    }
    FragmentTransaction ft = fm.beginTransaction();
    lf = new LoginFragment();
    ft.replace(R.id.mainContainer, lf);
    ft.addToBackStack(null);
    ft.commit();
}

@Override
public void onLogIn(String sessionID) {
    FragmentTransaction ft = fm.beginTransaction();
    MapScreenFragment mapFrag = new MapScreenFragment();
    ft.replace(R.id.loginpage, mapFrag);
    ft.addToBackStack(null);
    ft.commit();
}

fragment_login:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:facebook="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="login.shogun.comet.halp.LoginFragment"
android:orientation="vertical"
android:id="@+id/loginpage"
android:weightSum="1"
android:gravity="center"
android:background="@color/halp1Color">

<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@color/white"
    android:inputType="textPersonName"
    android:text="@string/Username"
    android:ems="10"
    android:id="@+id/username"
    android:layout_gravity="center_horizontal"
    android:layout_marginTop="60dp"
    android:gravity="center"
    android:layout_below="@+id/HalpLogo" />

<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@color/white"
    android:inputType="textPersonName"
    android:text="@string/Password"
    android:ems="10"
    android:id="@+id/password"
    android:layout_gravity="center_horizontal"
    android:gravity="center"
    android:layout_below="@+id/username"
    android:layout_alignStart="@+id/username"
    android:layout_marginTop="10dp" />

LoginFragment设置为:

inflater.inflate(R.layout.fragment_login, container, false);

fragment_map:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/map">

<fragment
    android:id="@+id/mapView"
    android:name="com.google.android.gms.maps.MapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:layout="@layout/fragment_map" />

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/fakeMarker"
    android:src="@drawable/student_turq"
    android:background="@color/transparent"
    android:contentDescription="@string/fakeMarker"
    android:layout_centerVertical="true"
    android:layout_centerHorizontal="true" />
</RelativeLayout>

MapScreenFragment设置为:

inflater.inflate(R.layout.fragment_map, container, false);

为了简洁起见,我删除了一堆按钮,并且在我的活动中设置内容视图和更改为了简洁而已被删除的片段之间也有逻辑。

谢谢你的时间!

1 个答案:

答案 0 :(得分:0)

您需要使用同一容器进行更换。尝试将第二个替换更改为R.id.mainContainer

 FragmentTransaction ft = fm.beginTransaction();
    lf = new LoginFragment();
    ft.replace(R.id.mainContainer, lf); <-----
    ft.addToBackStack(null);
    ft.commit();
}
@Override
public void onLogIn(String sessionID) {
    FragmentTransaction ft = fm.beginTransaction();
    MapScreenFragment mapFrag = new MapScreenFragment();
    ft.replace(R.id.loginpage, mapFrag); <------ change to R.id.mainContainer
    ft.addToBackStack(null);
    ft.commit();
}

另一个简单的解决方案是将fragment_map的主要RelativeLayout的背景颜色设置为白色。