gpt4 book ai didi

java - fragment 选项菜单 - 在 fragment 堆栈中创建多个实例

转载 作者:行者123 更新时间:2023-11-30 00:24:51 24 4
gpt4 key购买 nike

我有一个 Activity A 和两个 fragment B 和 C。

在 fragment B 和 C 中,我在 onCreate() 方法中调用了 setHasOptionsMenu(true)

此外,对于每个我都使用以下方法:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);

getActivity().invalidateOptionsMenu(); // Doesn't help much...
menu.clear();
inflater.inflate(R.menu.menu_act_detail, menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.action_favorite_act) {
Log.d(TAG, title);
return true;
} else if (item.getItemId() == R.id.action_visit_site_act) {
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
startActivity(i);
return true;
}
return super.onOptionsItemSelected(item);
}

所以 fragment B 和 C 的每个实例都有一个标题和 url。但是,当我将 B 和 C 的多个不同实例添加到 fragment 堆栈时,当我触发 action_favorite_act 选项菜单项时,它会记录第一个实例的标题。

这是我用来将 B 或 C 的实例添加到 fragment 堆栈的代码:

FragmentManager fragmentManager = getSupportFragmentManager();
Fragment fragment = ActDetailFragment.newInstance(id);
fragmentManager.beginTransaction()
.add(R.id.flContent, fragment, id)
.addToBackStack(null)
.commit();

本例中的 id 与属于每个实例的 url 字段相同。

示例行为:

  • 我将 B 的一个实例添加到标题 = "hello"和 url = "test.com"的 fragment 堆栈

  • 我触发了 action_favorite_act 菜单项,它记录了 hello

  • 我将 C 的一个实例添加到 fragment 堆栈中,title = "world"和 url = "site.com"

  • 我触发了 action_favorite_act 菜单项,它记录了 world

  • 我将 B 的另一个实例添加到 fragment 堆栈中,title = "goodbye"和 url = "another.com"

  • 我触发了 action_favorite_act 菜单项,它记录了 hello 而不是 goodbye!

无论我添加了多少个 B 或 C 实例,菜单项似乎都可以追溯到第一个实例。因此,helloworld 被记录,而不是位于堆栈顶部的 B 和 C 实例的标题。如何获取堆栈顶部的菜单项以响应操作?

最佳答案

我写了一个小应用程序来尝试重现您的问题,我做到了。幸运的是,我为我的 fragment 使用了透明背景,这很有帮助,因为这意味着我可以立即看到我所有的 fragment 都活着:

enter image description here

和您一样,我注意到当我选择选项菜单项时,我总是记录相同的消息(从第一个 fragment 开始)。

问题的根源似乎是 fragment 类的每个实例为其菜单项使用相同的 R.id 常量。所以你有例如您的 Activity 中 fragment B 的三个实例,但所有三个都可以处理对 R.id.action_favorite_act 的点击。据推测,Activity 只是迭代其 fragment 并将菜单事件传递给每个 fragment ,直到有人处理它,因此第一个总是获胜。

您可以通过使用 replace() 而不是 add() 来解决这个问题,这样一来,给定 fragment 类的实例只有一个存在并附加在任何时候一次。

如果这不能满足您的要求,我相信您必须为菜单项使用动态生成的 ID,以便每个 fragment 都有自己的项目 ID。

关于java - fragment 选项菜单 - 在 fragment 堆栈中创建多个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45577787/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com