разница между add (), replace () и addtobackstack ()

<p>в чем основное различие между вызовами этих методов:</p><pre><code>fragmenttransaction.addtobackstack(name); fragmenttransaction.replace(containerviewid, fragment, tag); fragmenttransaction.add(containerviewid, fragment, tag); </code></pre><p>что значит заменить уже существующий фрагмент, добавить фрагмент в состояние активности и добавить действие в задний стек?</p><p>во-вторых, с <code>findfragmentbytag()</code>, этот поиск тега добавляется с помощью метода <code>add()</code>/<code>replace()</code> или метода <code>addtobackstack()</code>?</p>

<p><strong>1)</strong> <code>fragmenttransaction.addtobackstack(str);</code></p><p><em>описание</em> - добавить эту транзакцию в задний стек. это означает, что транзакция будет запомнена после ее фиксации и будет отменять свою работу, когда позднее будет извлечена из стека.</p><p><strong>2)</strong> <code>fragmenttransaction.replace(int containerviewid, fragment fragment, string tag)</code></p><p><em>описание</em> - заменить существующий фрагмент, который был добавлен в контейнер. по сути, это то же самое, что вызов метода remove (fragment) для всех добавленных в данный момент фрагментов, которые были добавлены с тем же containerviewid, а затем добавлены (int, fragment, string) с теми же аргументами, что и здесь.</p><p><strong>3)</strong> <code>fragmenttransaction.add(int containerviewid, fragment fragment, string tag)</code></p><p><em>описание</em> - добавить фрагмент в состояние активности. этот фрагмент может также иметь свое представление (если fragment.oncreateview возвращает ненулевое значение) в контейнерное представление действия.</p><blockquote> <p>что значит заменить уже существующий фрагмент и добавить фрагмент к состоянию активности и добавление активности на спину стек?</p> </blockquote><p>существует стек, в котором хранятся все действия в рабочем состоянии. фрагменты относятся к деятельности. таким образом, вы можете добавить их, чтобы включить их в упражнение.</p><p>вы можете объединить несколько фрагментов в одном действии, чтобы создать многопанельный пользовательский интерфейс и повторно использовать фрагмент в нескольких действиях. это особенно полезно, когда вы определили свой контейнер фрагментов в разных макетах. вам просто нужно заменить любой другой фрагмент в любом макете.</p><p>когда вы переходите к текущему макету, у вас есть идентификатор этого контейнера, чтобы заменить его нужным фрагментом. </p><p>вы также можете вернуться к предыдущему фрагменту в backstack с помощью метода <code>popbackstack()</code>. для этого вам нужно добавить этот фрагмент в стек, используя <code>addtobackstack()</code>, а затем <code>commit()</code> для отражения. это в обратном порядке с током сверху.</p><blockquote> <p>findfragmentbytag выполняет этот поиск для тега, добавленного путем добавления/замены метод или метод addtobackstack?</p> </blockquote><p>если зависит от того, как вы добавили тег. затем он просто находит фрагмент по тегу, который вы определили ранее, либо при накачке из xml, либо при добавлении при добавлении в транзакцию.</p><p>ссылки: <a href="http://developer.android.com/reference/android/app/fragmenttransaction.html">fragmenttransaction</a> </p>

<p>еще одно важное различие между <code>add</code> и <code>replace</code> заключается в следующем: <code>replace</code> удаляет существующий фрагмент и добавляет новый фрагмент. это означает, что когда вы нажимаете кнопку «назад», фрагмент, который был заменен, будет создан с вызовом oncreateview. принимая во внимание, что <code>add</code> сохраняет существующие фрагменты и добавляет новый фрагмент, что означает, что существующий фрагмент будет активным, и они не будут находиться в состоянии «приостановлено», следовательно, когда кнопка «назад» нажата, oncreateview не вызывается для существующего фрагмента (фрагмент, который был там до нового фрагмент был добавлен). с точки зрения событий жизненного цикла фрагмента onpause, onresume, oncreateview и другие события жизненного цикла будут вызываться в случае <code>replace</code>, но они не будут вызываться в случае <code>add</code>. </p><p><strong>edit</strong>: нужно быть осторожным, если она использует какую-то библиотеку шины событий, такую как <a href="https://github.com/greenrobot/eventbus">eventbus greenrobot</a> , и повторно использует этот же фрагмент для укладки фрагмента поверх другого через <code>add</code>. в этом сценарии, даже если вы будете следовать рекомендациям и зарегистрировать шину событий в <code>onresume</code> и отменить регистрацию в <code>onpause</code>, шина событий будет по-прежнему активна в каждом экземпляре добавленного фрагмента, поскольку фрагмент <code>add</code> не вызовет ни один из этих методов жизненного цикла фрагмента. в результате прослушиватель шины событий в каждом активном экземпляре фрагмента будет обрабатывать одно и то же событие, которое может не соответствовать вашему желанию. </p>

<p>например, у действия есть 2 фрагмента, и мы используем <code>fragmentmanager</code> для замены/добавления <code>addtobackstack</code> каждого фрагмента в макет в действии</p><p><strong>используйте замену</strong></p><p><em>go fragment1</em></p><pre><code>fragment1: oncreateview fragment1: onstart fragment1: onresume </code></pre><p><em>go fragment2</em></p><pre><code>fragment1: onstop fragment1: ondestroyview fragment2: oncreateview fragment2: onstart fragment2: onresume </code></pre><p><em>pop fragment2</em></p><pre><code>fragment2: onstop fragment2: ondestroyview fragment2: ondestroy fragment1: oncreateview fragment1: onstart fragment1: onresume </code></pre><p><em>pop fragment1</em></p><pre><code>fragment1: onstop fragment1: ondestroyview fragment1: ondestroy </code></pre><p><strong>используйте add</strong></p><p><em>go fragment1</em></p><pre><code>fragment1: oncreateview fragment1: onstart fragment1: onresume </code></pre><p><em>go fragment2</em></p><pre><code>fragment2: oncreateview fragment2: onstart fragment2: onresume </code></pre><p><em>pop fragment2</em></p><pre><code>fragment2: onstop fragment2: ondestroyview fragment2: ondestroy </code></pre><p><em>pop fragment1</em></p><pre><code>fragment1: onstop fragment1: ondestroyview fragment1: ondestroy </code></pre><p> <a href="https://github.com/phanvanlinh/androidfragmentaddvsreplace.git">пример проекта</a> </p>

<p>основное различие между <code>add()</code> и <code>replace()</code> можно описать так:</p><ul> <li><code>add()</code> используется для простого добавления фрагмента в некоторый корневой элемент.</li> <li><code>replace()</code> ведет себя аналогично, но сначала удаляет предыдущие фрагменты, а затем добавляет следующий фрагмент.</li> </ul><p>мы можем увидеть точную разницу, когда мы используем <code>addtobackstack()</code> вместе с <code>add()</code> или <code>replace()</code>.</p><p>когда мы нажимаем кнопку «назад» после, в случае <code>add()</code>... oncreateview никогда не вызывается, но в случае <code>replace()</code>, когда мы нажимаем кнопку «назад», oncreateview вызывается каждый раз.</p>

<p>хотя это старый вопрос, на который уже дан ответ, возможно, эти следующие примеры могут дополнить принятый ответ, и они могут быть полезны для некоторых новых программистов в android, как и я.</p><p><strong> вариант 1 - «addtobackstack ()» никогда не используется </strong></p><p><em> случай 1а - добавление, удаление и нажатие кнопки «назад» </em></p><pre><code>activity : oncreate() - onstart() - onresume() activity is visible add fragment a : onattach() - oncreate() - oncreateview() - onactivitycreated() - onstart() - onresume() fragment a is visible add fragment b : onattach() - oncreate() - oncreateview() - onactivitycreated() - onstart() - onresume() fragment b is visible add fragment c : onattach() - oncreate() - oncreateview() - onactivitycreated() - onstart() - onresume() fragment c is visible remove fragment c : onpause() - onstop() - ondestroyview() - ondestroy() - ondetach() fragment b is visible (back button clicked) activity : onpause() - onstop() - ondestroy() fragment a : onpause() - onstop() - ondestroyview() - ondestroy() - ondetach() fragment b : onpause() - onstop() - ondestroyview() - ondestroy() - ondetach() app is closed, nothing is visible </code></pre><p><em> случай 1b - добавление, замена и нажатие кнопки «назад» </em></p><pre><code>activity : oncreate() - onstart() - onresume() activity is visible add fragment a : onattach() - oncreate() - oncreateview() - onactivitycreated() - onstart() - onresume() fragment a is visible add fragment b : onattach() - oncreate() - oncreateview() - onactivitycreated() - onstart() - onresume() fragment b is visible (replace fragment c) fragment b : onpause() - onstop() - ondestroyview() - ondestroy() - ondetach() fragment a : onpause() - onstop() - ondestroyview() - ondestroy() - ondetach() fragment c : onattach() - oncreate() - oncreateview() - onactivitycreated() - onstart() - onresume() fragment c is visible (back button clicked) activity : onpause() - onstop() - ondestroy() fragment c : onpause() - onstop() - ondestroyview() - ondestroy() - ondetach() app is closed, nothing is visible </code></pre><p><strong> вариант 2 - всегда используется «addtobackstack ()» </strong></p><p><em> случай 2а - добавление, удаление и нажатие кнопки «назад» </em></p><pre><code>activity : oncreate() - onstart() - onresume() activity is visible add fragment a : onattach() - oncreate() - oncreateview() - onactivitycreated() - onstart() - onresume() fragment a is visible add fragment b : onattach() - oncreate() - oncreateview() - onactivitycreated() - onstart() - onresume() fragment b is visible add fragment c : onattach() - oncreate() - oncreateview() - onactivitycreated() - onstart() - onresume() fragment c is visible remove fragment c : onpause() - onstop() - ondestroyview() fragment b is visible (back button clicked) fragment c : oncreateview() - onactivitycreated() - onstart() - onresume() fragment c is visible (back button clicked) fragment c : onpause() - onstop() - ondestroyview() - ondestroy() - ondetach() fragment b is visible (back button clicked) fragment b : onpause() - onstop() - ondestroyview() - ondestroy() - ondetach() fragment a is visible (back button clicked) fragment a : onpause() - onstop() - ondestroyview() - ondestroy() - ondetach() activity is visible (back button clicked) activity : onpause() - onstop() - ondestroy() app is closed, nothing is visible </code></pre><p><em> случай 2b - добавление, замена, удаление и нажатие кнопки «назад» </em></p><pre><code>activity : oncreate() - onstart() - onresume() activity is visible add fragment a : onattach() - oncreate() - oncreateview() - onactivitycreated() - onstart() - onresume() fragment a is visible add fragment b : onattach() - oncreate() - oncreateview() - onactivitycreated() - onstart() - onresume() fragment b is visible (replace fragment c) fragment b : onpause() - onstop() - ondestroyview() fragment a : onpause() - onstop() - ondestroyview() fragment c : onattach() - oncreate() - oncreateview() - onactivitycreated() - onstart() - onresume() fragment c is visible remove fragment c : onpause() - onstop() - ondestroyview() activity is visible (back button clicked) fragment c : oncreateview() - onactivitycreated() - onstart() - onresume() fragment c is visible (back button clicked) fragment c : onpause() - onstop() - ondestroyview() - ondestroy() - ondetach() fragment a : oncreateview() - onactivitycreated() - onstart() - onresume() fragment b : oncreateview() - onactivitycreated() - onstart() - onresume() fragment b is visible (back button clicked) fragment b : onpause() - onstop() - ondestroyview() - ondestroy() - ondetach() fragment a is visible (back button clicked) fragment a : onpause() - onstop() - ondestroyview() - ondestroy() - ondetach() activity is visible (back button clicked) activity : onpause() - onstop() - ondestroy() app is closed, nothing is visible </code></pre><p><strong> вариант 3 - «addtobackstack ()» используется не всегда </strong>(в приведенных ниже примерах без указания указывает, что он не используется)</p><p><em> случай 3а - добавление, удаление и нажатие кнопки «назад» </em></p><pre><code>activity : oncreate() - onstart() - onresume() activity is visible add fragment a : onattach() - oncreate() - oncreateview() - onactivitycreated() - onstart() - onresume() fragment a is visible add fragment b w/o: onattach() - oncreate() - oncreateview() - onactivitycreated() - onstart() - onresume() fragment b is visible add fragment c w/o: onattach() - oncreate() - oncreateview() - onactivitycreated() - onstart() - onresume() fragment c is visible remove fragment c : onpause() - onstop() - ondestroyview() - ondestroy() - ondetach() fragment b is visible (back button clicked) fragment b : onpause() - onstop() - ondestroyview() - ondestroy() - ondetach() fragment a : onpause() - onstop() - ondestroyview() - ondestroy() - ondetach() activity is visible (back button clicked) activity : onpause() - onstop() - ondestroy() app is closed, nothing is visible </code></pre><p><em> случай 3b - добавление, замена, удаление и нажатие кнопки «назад» </em></p><pre><code>activity : oncreate() - onstart() - onresume() activity is visible add fragment a : onattach() - oncreate() - oncreateview() - onactivitycreated() - onstart() - onresume() fragment a is visible add fragment b w/o: onattach() - oncreate() - oncreateview() - onactivitycreated() - onstart() - onresume() fragment b is visible (replace fragment c) fragment b : onpause() - onstop() - ondestroyview() - ondestroy() - ondetach() fragment a : onpause() - onstop() - ondestroyview() fragment c : onattach() - oncreate() - oncreateview() - onactivitycreated() - onstart() - onresume() fragment c is visible remove fragment c : onpause() - onstop() - ondestroyview() activity is visible (back button clicked) fragment c : oncreateview() - onactivitycreated() - onstart() - onresume() fragment c is visible (back button clicked) fragment c : onpause() - onstop() - ondestroyview() - ondestroy() - ondetach() fragment a : oncreateview() - onactivitycreated() - onstart() - onresume() fragment a is visible (back button clicked) fragment a : onpause() - onstop() - ondestroyview() - ondestroy() - ondetach() activity is visible (back button clicked) activity : onpause() - onstop() - ondestroy() app is closed, nothing is visible </code></pre>

<p><em> add () </em>... это используется для добавления фрагмента в framelayout и использования для этого преимущества. предыдущий фрагмент может отображаться в фоновом режиме.</p><pre><code>transaction.add(r.id.framelayout, fragment); </code></pre><p><em> replace () </em>... это использовать для замены фрагмента в framelayout и использовать это преимущество: предыдущий фрагмент не может отображаться в фоновом режиме, но хранить весь фрагмент</p><pre><code>transaction.replace(r.id.framelayout, fragment); </code></pre><p><em> addtobackstack () </em>... используется для хранения всего фрагмента в фоновом режиме, и когда пользователь может нажать кнопку «назад», затем перейти к предыдущему фрагменту.</p><pre><code>transaction.addtobackstack(null); </code></pre>