Android: заменить контейнер фрагмента внутри CoordinatorLayout

У меня есть следующий XML:

<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/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/AppTheme.PopupOverlay" />

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

<!--I use this include as container with the FrameLayout below-->
<!--<include layout="@layout/content_main" />-->
<FrameLayout
    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:id="@+id/content_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.improvemybrand.MainActivity"
    tools:showIn="@layout/app_bar_main">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />
</FrameLayout>

<android.support.design.widget.FloatingActionButton
    android:id="@+id/fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom|end"
    android:layout_margin="@dimen/fab_margin"
    android:src="@android:drawable/ic_input_add" />

и проблема проста:

Когда я пытаюсь заменить контейнер FrameLayout из моего координатора, он не работает, он показывает новый фрагмент, но также сохраняет старый, в моем простом примере останется TextView с Hello world.

Для замены я использую следующий код:

FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.replace(R.id.content_main, fragment);
        transaction.commit();

Есть идеи?

 Mike M.07 июн. 2016 г., 01:44
Да, я искал дубликат, но я не могу найти тот, который относится к той же проблеме и имеет правильный ответ. Дай мне немного, и я сделаю ответ из наших комментариев, когда я получу секунду.
 Mike M.07 июн. 2016 г., 01:13
Я не уверен, что вы подразумеваете под этим, ноFragmentTransactionтолько ручкаFragmentи ихViews. Если вы хотите, вы можете сделатьTextView другойFragment«sViewили его часть, то транзакция заменит его соответственно. Или вы можете просто удалить его, или иным образом скрыть, самостоятельно, если он не должен быть частьюFragment.
 Mike M.07 июн. 2016 г., 01:32
Нет проблем. Я должен упомянуть, что любойFragment Вы хотите заменить / удалить должны быть загружены динамически - то есть,не определяется как<fragment> элемент в вашем макете XML - но, похоже, это ваш план в любом случае.
 Thiago Pereira07 июн. 2016 г., 01:21
@MikeM. Я думаю, что понял ... Я должен удалить TextView из XML, и если я действительно этого хочу, я должен добавить программно в onCreate, а затем FragmentTransaction будет добавлять фрагменты внутри моего контейнера. Я сделаю несколько тестов и дам вам знать. Благодарю.
 Mike M.07 июн. 2016 г., 01:08
TextView это неFragment«sViewтак что это не будет зависеть отFragmentTransaction.
 Thiago Pereira07 июн. 2016 г., 01:10
редактировать: @MikeM. я должен обернуть TextView внутри фрагмента и выбрать фрагмент для замены?
 Thiago Pereira07 июн. 2016 г., 01:41
@MikeM. да, спасибо, это сработало! Основной фрагмент загружается во время выполнения, а также другие. Не могу дать вам очки без ответа :(

Ответы на вопрос(2)

Решение Вопроса

FragmentTransactionиметь дело только сFragmentи ихViews.TextView Вы определили в своем макете не является (частью)Fragment«sViewтак что это не будет зависеть отFragmentTransactionиFragment в вашем фрагменте будет просто добавлен поверх него.

У вас есть несколько вариантов. Вы можете скрыть или удалитьTextView себя при выполнении транзакции. Это может быть предпочтительнее, если так простоTextView это все, что вам нужно изначально, и воткнуть его вFragment может быть излишним. Вы также можете просто установить непрозрачный фон наFragmentмакет, который будет эффективно скрыватьTextView.

Однако, вероятно, наилучшим вариантом являетсяTextView в макете для другогоFragment который загружается при запуске. Последующие транзакции заменит / удалит его, как вы ожидаете. Обратите внимание, что любойFragment Вы хотите заменить / удалить во время выполнения должны быть загружены в ваш код динамически. То есть они не могут быть определены в<fragment> элементы в вашемActivityмакет.

как это.

fragment_hello_world.xml

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

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        />

</LinearLayout>

HelloWorldFragment

public class HelloWorldFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_hello_world, container, false);;
    }

}

Ваш ответ на вопрос