【问题标题】:Android Fragment lifecycle and FragmentManager.add()Android Fragment 生命周期和 FragmentManager.add()
【发布时间】:2019-10-17 20:11:15
【问题描述】:

我有 MainActivity

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

        setContentView(R.layout.activity_main);

        getSupportFragmentManager()
                .beginTransaction()
                .add(R.id.fragment_container, AFragment.newInstance(75))
                .commit();
    }

    @Override
    public void onBackPressed() {
       if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
           getSupportFragmentManager().popBackStack();
       } else {
           super.onBackPressed();
       }
    }

另外,我有 AFragment

@Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_a, container, false);

        view.findViewById(R.id.show_b_btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                AppCompatActivity appCompatActivity = (AppCompatActivity) getActivity();

                appCompatActivity.getSupportFragmentManager()
                        .beginTransaction()
                        .add(R.id.fragment_container, BFragment.newInstance())
                        .addToBackStack("B")
                        .commit();
            }
        });

        return view;
    }

BFragment 只是一个空片段。

我有以下片段生命周期输出:

Open the App:
A - onCreateView
A - onStart
A - onResume

Click R.id.show_b_btn on AFragment:
B - onStart
B - onResume

Click back button:
B - onPause
B - onStop

Close the App:
A - onPause
A - onStop

那么,问题是为什么当我点击 ShowBFragment 时 AFragment 不调用 onPause 以及为什么当我点击返回按钮时 AFragment 不调用 onResume?

我认为这是因为我使用了 .add() 而 BFragment 只是覆盖了 AFragment,所以当 BFragment 可见时,AFragment 也会“存活”,对吗?

【问题讨论】:

  • 是的,你是对的。当您使用 .add() 和 BFragment 时,它只会覆盖 AFragment,因此当 BFragment 可见时,AFragment 也会“存在”

标签: android android-fragments


【解决方案1】:

只需替换

getSupportFragmentManager()
                .beginTransaction()
                .add(R.id.fragment_container, AFragment.newInstance(75))
                .commit();

getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.fragment_container, AFragment.newInstance(75))
                .commit();

如果您在容器上使用 FragmentTransaction.add 会发生这种情况。您添加的片段将放置在现有片段的顶部。如果您使用 FragmentTransaction.replace(R.id.container,fragment) 它将删除容器中已经存在的所有片段并将新片段添加到同一个容器中

你也可以参考下面的链接

Difference between add(), replace(), and addToBackStack()

【讨论】:

  • 如果我这样做,AFragment 将调用 onResume 和 onPause。我不需要它。我一直对为什么使用 .add() 时 AFragment 不这样做很感兴趣。
  • 如果在容器上使用 FragmentTransaction.add 会发生这种情况。您添加的片段将放置在现有片段的顶部。如果您使用 FragmentTransaction.replace(R.id.container,fragment) 它将删除容器中已经存在的所有片段并将新片段添加到同一个容器中
  • 你能回答吗
  • 对不起,我做不到。我的声望
【解决方案2】:

1) fragmentTransaction.addToBackStack(str);

描述 - 将此交易添加到后台堆栈。这意味着事务将在提交后被记住,并在以后从堆栈中弹出时反转其操作。

2) fragmentTransaction.replace(int containerViewId, Fragment fragment, String tag)

描述 - 替换已添加到容器中的现有片段。这本质上与为所有当前添加的片段调用 remove(Fragment) 相同,这些片段使用相同的 containerViewId 添加,然后使用此处给出的相同参数调用 add(int, Fragment, String)。

3) fragmentTransaction.add(int containerViewId, Fragment fragment, String tag)

描述 - 将片段添加到活动状态。该片段还可以选择将其视图(如果 Fragment.onCreateView 返回非 null)放入活动的容器视图中。 1) fragmentTransaction.addToBackStack(str);

描述 - 将此交易添加到后台堆栈。这意味着事务将在提交后被记住,并在以后从堆栈中弹出时反转其操作。

2) fragmentTransaction.replace(int containerViewId, Fragment fragment, String tag)

描述 - 替换已添加到容器中的现有片段。这本质上与为所有当前添加的片段调用 remove(Fragment) 相同,这些片段使用相同的 containerViewId 添加,然后使用此处给出的相同参数调用 add(int, Fragment, String)。

3) fragmentTransaction.add(int containerViewId, Fragment fragment, String tag)

描述 - 将片段添加到活动状态。该片段还可以选择将其视图(如果 Fragment.onCreateView 返回非 null)放入 Activity 的容器视图中。

替换一个已经存在的fragment,在activity状态中添加一个fragment,在back stack中添加一个activity是什么意思?

有一个堆栈,所有处于运行状态的活动都保存在其中。片段属于活动。因此,您可以添加它们以将它们嵌入到活动中。

您可以在单个活动中组合多个片段以构建多窗格 UI 并在多个活动中重用一个片段。当您在不同的布局中定义了片段容器时,这非常有用。您只需要替换为任何布局中的任何其他片段。

当您导航到当前布局时,您可以使用该容器的 id 将其替换为您想要的片段。

您还可以使用 popBackStack() 方法返回到 backStack 中的上一个片段。为此,您需要使用 addToBackStack() 将该片段添加到堆栈中,然后使用 commit() 进行反映。这与当前在顶部的顺序相反。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多