【问题标题】:Why Fragment's menu items dismiss, get mixed, replace other items after Fragment is shown/hidden?为什么 Fragment 的菜单项在 Fragment 显示/隐藏后消失、混合、替换其他项目?
【发布时间】:2018-08-16 16:54:34
【问题描述】:

问题描述

我有BaseFragment 负责显示后退按钮、处理后退按钮点击、将工具栏设置为操作栏。我所有的片段都来自它。其中几个有菜单项。我不使用片段替换,我只使用添加/显示/隐藏。所以,当我的fragment出现时,他们的菜单项可能会消失,也可能被其他fragment的菜单项替换或者有时会混在一起。这是我的BaseFragment

abstract class BaseFragment : Fragment() {

abstract fun getToolbar(): Toolbar?


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setHasOptionsMenu(true)
}

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    (activity as AppCompatActivity).setSupportActionBar(getToolbar())
}

//this function is called when fragment needs to show back button
fun showBackButtonOnFragment() {
    (activity as AppCompatActivity).supportActionBar?.setDisplayHomeAsUpEnabled(true)

}

//handling onBackPressed 
override fun onOptionsItemSelected(item: MenuItem?): Boolean {
    if (item?.itemId == android.R.id.home) {
        activity?.onBackPressed()
    }
    return true
}

}

这是我的子片段的onCreateOptionsMenuonOptionsItemSelected 方法之一。请注意,我不调用setHasOptionsMenu(),因为它是在BaseFragment 中调用的。

public class HistoryFragment extends BaseFragment  {

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    //here I don't use super to call base method
    inflater.inflate(R.menu.filter_menu, menu);
}

@Override
public boolean onOptionsItemSelected(@Nullable MenuItem item) {
    switch (item.getItemId()) {
        case R.id.filter_menu:
            openFilterActivity();
    }
    return true;
}



    @Nullable
    @Override
    public Toolbar getToolbar() {
        return this.toolbar;
    }
  }

我尝试了什么

我尝试在BaseFragment 中调用menu.clear() 以删除所有菜单项(如果它们仍然存在)。它没有用。我怀疑在BaseFragment 中调用setHasOptionsMenu() 可能是个坏主意,因为某些片段根本没有菜单项。为此,我创建了抽象函数来识别子片段是否需要菜单,并根据结果,我用真假调用setHasOptionsMenu()。但这没有帮助。

问题 问题的原因可能是什么?我的BaseFragment 有罪吗?如何解决问题?

【问题讨论】:

    标签: android android-fragments android-menu


    【解决方案1】:

    确实setHasOptionsMenu() 调用invalidateOptionsMenu()。我非常怀疑。

    您应该在子片段中手动调用setHasOptionsMenu(),而不是在您的BaseFragment 中调用它。

    【讨论】:

    • 感谢您的回复,但没有帮助。我使用BottomNavigationView,当我选择第一个选项卡时,在第二个选项卡之后,我从第一个选项卡打开另一个片段(我们称之为'孩子')。当我返回第二个选项卡时,它的菜单项被替换为“子”片段的菜单项。
    • 哦,所以它保留了以前的菜单?然后,每次在onResume() 上恢复时,您都应该使 Fragment 的选项菜单无效。碰巧我相信您仅在创建时才使菜单无效(=更改),而不是在恢复时。
    • 为了在Fragment中使用invalidateOptionsMenu,需要使用getActivity方法吗?
    • 是的,getActivity().invalidateOptionsMenu()。至少这是我的想法。
    • 我的想法是您的孩子Fragment 正在更新菜单,而在onBackPressed() 时,菜单仍然是孩子的,因为父母需要刷新菜单。只需尝试刷新您片段的onResume() 中的菜单即可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    • 2017-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多