问题描述
我有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
}
}
这是我的孩子片段的onCreateOptionsMenu
和onOptionsItemSelected
方法之一。请注意,我不称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
中调用它。