为什么 Fragment 的菜单项在显示/隐藏 Fragment 后会关闭、混合、替换其他项目?



问题描述

我有BaseFragment负责显示后退按钮、处理后退按钮单击、将工具栏设置为操作栏。我所有的碎片都从它延伸出来。其中几个有菜单项。我不使用片段替换,我只使用添加/显示/隐藏。因此,当我的片段出现时,他们的菜单项可能会消失,也可以被其他人的片段的菜单项替换,或者有时会混合在一起。这是我的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为此感到内疚吗?如何解决问题?

事实上,setHasOptionsMenu()invalidateOptionsMenu()。我高度怀疑这一点。

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

最新更新