Сделать фрагмент полностью внутри фрейма

В моем приложении я хочу сохранить один и тот же рекламный баннер внизу всех экранов, поэтому я использую одно действие с несколькими фрагментами.

В файле макета Activity (activity_mail.xml) у меня есть FrameLayout в качестве контейнера фрагментов и AdView внизу, чтобы показывать баннерную рекламу из Admob.

 <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity"
        tools:ignore="MergeRootFrame">
        <FrameLayout
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
        <fragment
            android:id="@+id/adFragment"
            android:name="com.jiyuzhai.wangxizhishufazidian.MainActivity$AdFragment"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true" />
</RelativeLayout>

Макет фрагмента для замены существующего фрагмента

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:background="@drawable/theme_color"
        android:layout_alignParentTop="true"
        android:text="Topbar in fragment"
        android:textColor="@android:color/white"
        android:textSize="30sp"/>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:background="@drawable/theme_color"
        android:layout_alignParentBottom="true"
        android:text="Bottombar in fragment"
        android:textColor="@android:color/white"
        android:textSize="30sp"/>
</RelativeLayout>

Код для замены существующего фрагмента

fragment = new LinmoFragment();
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.setCustomAnimations(R.anim.fade_in, R.anim.fade_out, R.anim.fade_in, R.anim.fade_out);
fragmentTransaction.replace(R.id.container, fragment);
fragmentTransaction.commit();

Но когда я заменяю фрагменты в контейнере, нижняя часть фрагмента скрывается AdView, другими словами, фрагмент находится за пределами Framelayout, я хочу, чтобы фрагмент полностью находился внутри контейнера. это возможно?

Вот что я хочу

введите здесь описание изображения

и это то, что я получаю (Рекламный баннер скрывает нижнюю панель фрагмента)

введите здесь описание изображения

Есть идеи?

Кстати, я считаю, что нет способа сохранить один и тот же баннер для всех экранов с несколькими действиями в Android, многие люди на SO сказали, что вам нужно использовать одиночные действия с несколькими фрагментами, тогда вы можете динамически добавлять/удалять свои фрагменты без перезагрузки новый баннер, но для этого подхода не найден код, поэтому я пробую сам. если у вас есть лучшие решения, пожалуйста, помогите мне.


person zdd    schedule 15.05.2015    source источник


Ответы (2)


Попробуй это:

 <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity"
        tools:ignore="MergeRootFrame">
        <fragment
            android:id="@+id/adFragment"
            android:name="com.jiyuzhai.wangxizhishufazidian.MainActivity$AdFragment"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true" />
        <FrameLayout
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_above="@id/adFragment" />
</RelativeLayout>

Изменения, которые я внес в исходный файл макета, заключались в перемещении определения adFragment над макетом фрейма, переносе содержимого по высоте макета фрейма и добавлении атрибута layout_above, чтобы макет фрейма отображался над фрагментом объявления.

В качестве альтернативного подхода можно было бы использовать вертикальный линейный макет с макетом фрейма сначала с весом макета, равным 1 (и у фрагмента объявления не было бы веса макета).

Кстати, фрагмент полностью содержится в вашем макете фрейма. Макет фрейма просто перекрывался фрагментом объявления в исходном макете. Приведенное выше предложение делает так, чтобы не было перекрытия.

Надеюсь это поможет.

person Justin Hong    schedule 15.05.2015
comment
Спасибо, работает после добавления этой строки android:layout_above="@id/adFragment - person zdd; 18.05.2015

Если вы хотите избежать перекрытия и заставить контейнер заполнять экран, вам следует просто изменить RelativeLayout на LinearLayout.

 <LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    tools:ignore="MergeRootFrame"
    android:orientation:"vertical"
    >
    <FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"  />
    <fragment
        android:id="@+id/adFragment"
        android:name="com.jiyuzhai.wangxizhishufazidian.MainActivity$AdFragment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</LinearLayout>
person inmyth    schedule 15.05.2015