标签: fragment-backstack

这是在离开深层嵌套堆栈时清理Fragment堆栈的正确方法吗?

我正在使用Android兼容性库来实现片段并扩展了布局示例,以便片段包含一个触发另一个片段的按钮.

在左侧的选择窗格中,我有5个可选项 - A B C D E.

每个都FragmentTransaction:replace在详细信息窗格中加载一个片段(via ) -a b c d e

现在我扩展了片段e以包含一个按钮,该按钮e1还会在详细信息窗格中加载另一个片段.我在片段e的onClick方法上做了这个,如下所示:

FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.replace(R.id.details_frag, newFrag);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack(null);
ft.commit();
Run Code Online (Sandbox Code Playgroud)

如果我做出以下选择:

E - e - e1 - D - E
Run Code Online (Sandbox Code Playgroud)

然后片段e在详细信息窗格中.这很好,我想要的.但是,如果我back在此时按下按钮它什么都不做.我必须点击两次,因为e1它仍然在堆栈上.点击后我在onCreateView中得到一个空指针异常:

为了"解决"这个问题,无论何时A B C D E选择,我都添加了以下内容:

FragmentManager fm = getActivity().getSupportFragmentManager();
for(int i = 0; i < fm.getBackStackEntryCount(); ++i) {
    fm.popBackStack();
}
Run Code Online (Sandbox Code Playgroud)

只是想知道这是否是正确的解决方案或我是否应该做一些不同的事情?

android android-fragments fragment-backstack

127
推荐指数
4
解决办法
13万
查看次数

FragmentManager和FragmentTransaction到底做了什么?

我在下面有简单的代码

FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, mFeedFragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
Run Code Online (Sandbox Code Playgroud)

这些代码行做了什么?

android fragmenttransaction fragmentmanager fragment-backstack

49
推荐指数
2
解决办法
7万
查看次数

如何从android中的后栈中删除特定片段

我有一个关于从后栈中删除特定片段的问题.我的场景是这样的.片段-1被片段-2替换,然后片段-2被片段-3替换.

致电订单; 片段-1 - >片段-2 - >片段-3.

当Fragment-3在屏幕上,然后单击后退按钮时,我想去

片段-1.这意味着我想从后台堆栈中删除Fragment-2.

这该怎么做 ?

android fragment android-fragments fragment-backstack

19
推荐指数
4
解决办法
4万
查看次数

如何在viewpager的特定选项卡中显示当前片段?

我想得到最后一个片段在backstack中,或者当前显示它对我来说是相同的tab b_1.正如您在下图中看到的那样,我有一个ViewPager,另一个是内部的tab b.因此,显示了四个当前片段.

问题:如何获取Fragment 2实例?

我见过另一种解决方案,但没有一种适用于这种情况.

注释: ViewPager中托管的片段不是必需的.我可以在一个标签中打开另外两个片段.

脚本

使用这种方法,我得到所有当前可见的片段,但不是我想要的特定片段.

public ArrayList<Fragment> getVisibleFragment() {
    List<Fragment> fragments = getSupportFragmentManager().getFragments();
    ArrayList<Fragment> visibleFragments = new ArrayList<>();
    if (fragments != null) {
        for (Fragment fragment : fragments) {
            if (fragment != null && fragment.isVisible())
                visibleFragments.add(fragment);
        }
    }
    return visibleFragments;
}
Run Code Online (Sandbox Code Playgroud)

一些有趣的代码

activity_main.xml中

<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.design.widget.TabLayout
            android:id="@+id/tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:tabMode="fixed"
            app:tabGravity="fill"/>
    </android.support.design.widget.AppBarLayout>

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

</android.support.design.widget.CoordinatorLayout>
Run Code Online (Sandbox Code Playgroud)

MainActivity.java

public class …
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-viewpager fragment-backstack

18
推荐指数
1
解决办法
3万
查看次数

使用片段为BottomNavigationView Android中的每个选项卡分隔Back Stack

我正在BottomNavigationViewAndroid应用中实现导航.我正在使用Fragments为每个选项卡设置内容.

我知道如何为每个选项卡设置一个片段,然后在单击选项卡时切换片段.但是,如何为每个选项卡分别设置一个后备堆栈?以下是设置一个片段的代码:

Fragment selectedFragment = ItemsFragment.newInstance();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.content, selectedFragment);
transaction.commit();
Run Code Online (Sandbox Code Playgroud)

例如,FragmentA和B将位于选项卡1下,FragmentC和D位于选项卡2下.启动应用程序时,将显示片段A并选择选项卡1.然后Fragment可以用片段B替换A.当选择标签2时,应显示片段C. 如果选择了选项卡1,Fragment则应再次显示B. 此时,应该可以使用后退按钮显示片段A.

以下是fragment在同一选项卡中设置的代码:

Fragment selectedFragment = ItemsFragment.newInstance();
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.content, selectedFragment);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.addToBackStack(null);
ft.commit();
Run Code Online (Sandbox Code Playgroud)

android android-fragments fragment-backstack bottomnavigationview

18
推荐指数
1
解决办法
7402
查看次数

enter/exit和popEnter/popExit的区别是什么,以及它将在pop堆栈中运行的事务动画

在setCustomAnimations()中,动画需要四个资源ID.不是很了解他们.如果有人有更清晰的图片,如果你能解释,将不胜感激.

假设片段A添加在占位符和后台堆栈中.

FragmentTransaction ft = fm.beginTransaction();
        ft.replace(R.id.holder, fragA, FragmentA.FRAGMENT_NAME);
        ft.addToBackStack(FragmentA.FRAGMENT_NAME);
        ft.setCustomAnimations(R.anim.slide_in_from_bottom, R.anim.slide_in_from_top, R.anim.slide_in_from_left, R.anim.slide_in_from_right);
        ft.show(frag);
        ft.commit();
Run Code Online (Sandbox Code Playgroud)

并用片段B替换:

FragmentTransaction ft = fm.beginTransaction();
        ft.replace(R.id.holder, fragB, FragmentB.FRAGMENT_NAME);
        ft.addToBackStack(FragmentB.FRAGMENT_NAME);
        ft.setCustomAnimations(R.anim.slide_in_from_bottom, R.anim.slide_in_from_top, R.anim.slide_in_from_left, R.anim.slide_in_from_right);
        ft.show(frag);
        ft.commit();
Run Code Online (Sandbox Code Playgroud)

下次如果做一个popstack()

fm.popBackStackImmediate(FragmentB.FRAGMENT_NAME,
                                FragmentManager.POP_BACK_STACK_INCLUSIVE);
Run Code Online (Sandbox Code Playgroud)

它将运行哪个事务的动画?

/**
 * Set specific animation resources to run for the fragments that are
 * entering and exiting in this transaction. The <code>popEnter</code>
 * and <code>popExit</code> animations will be played for enter/exit
 * operations specifically when popping the back stack.
 */
public abstract FragmentTransaction setCustomAnimations(@AnimRes int …
Run Code Online (Sandbox Code Playgroud)

android fragmenttransaction fragment-backstack

13
推荐指数
1
解决办法
3227
查看次数

PopBackStack但保留android中的第一个片段

我正在处理片段事务,而backstack是这样的:

fragA => fragB => fragC => fragD
Run Code Online (Sandbox Code Playgroud)

我想从碎片回来之后回到fragA

fragD => onBackPress => fragA
Run Code Online (Sandbox Code Playgroud)

所以,我试过像:

getChildFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
Run Code Online (Sandbox Code Playgroud)

但它清除了所有的后台堆叠,如何将第一个碎片保留在后台堆叠中?非常感谢

android android-fragments back-stack android-fragmentactivity fragment-backstack

12
推荐指数
1
解决办法
2万
查看次数

Android Fragment Back Stack

我在我的项目中使用了多个片段.我想保存Fragment的状态并在我回到此状态时恢复此状态.在此片段中,我显示了多个图像,这些图像在按钮点击时发生变 我使用以下代码:

String backStateName = fragment.getClass().getName();
FragmentManager fragmentManager = getSupportFragmentManager();
boolean fragmentPopped = fragmentManager.popBackStackImmediate(backStateName, 0);
if (!fragmentPopped) {
 FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
 fragmentTransaction.replace(R.id.container_body, fragment);
 fragmentTransaction.addToBackStack(backStateName);
 fragmentTransaction.commit();
}
Run Code Online (Sandbox Code Playgroud)

它工作正常并保存状态,但它不显示以前的图像.

任何帮助,建议或教程将受到高度赞赏.谢谢.

android savestate android-fragments back-stack fragment-backstack

12
推荐指数
1
解决办法
1229
查看次数

在片段后台更改上更改导航抽屉选定项目

我有两个片段FragmentHomeFragmentAbout,我已经添加NavigationDrawer到应用程序,当我点击Home它打开FragmentHomeAbout打开FragmentAbout,当我打开FragmentAbout我也在它堆栈中.这工作正常.

现在的问题是,当我点击About并按回按钮它进入FragmentHomeNavigationDrawer仍然显示About所选项目时,我想将此选定项目更改为Home当我按下后退按钮时FragmentAbout

家庭活动:

public class ActivityHome extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {

Toolbar toolbar;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);

    // Toolbar
    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    // Drawer layout
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.nav_drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.nav_drawer_open, R.string.nav_drawer_close);
    assert drawer != null;
    drawer.setDrawerListener(toggle);
    toggle.syncState(); …
Run Code Online (Sandbox Code Playgroud)

android android-fragments fragmenttransaction navigation-drawer fragment-backstack

10
推荐指数
2
解决办法
5238
查看次数

无需轻拂即可管理片段Backstack流程

  1. 我创建了一个AppCompatActivity Opened片段A-> B-> C-> D-> E-> F with replace()
  2. 当我按下按钮时,我在F上包含按钮我要清除碎片到C并想在C顶部打开G所以新的序列将是A-> B-> C-> GI可以用popBackStackImmediate执行此操作(并使用替换功能在C顶部添加G.

问题:当我按下按钮时,我看到C的几分之一秒,然后显示G.To防止这种情况我试图在答案的帮助下停止动画,但即使动画停止,C仍然可见几分之一秒片段.

在更换C顶部的片段时,有没有更好的方法来设计片段流或解决这些电影的方法?

android android-fragments fragmentmanager fragment-backstack

10
推荐指数
1
解决办法
317
查看次数