问题描述
我有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;
}
}
我尝试过的事情
我试图调用menu.clear()
中的BaseFragment
来删除所有菜单项(如果仍然存在)。没用我怀疑在setHasOptionsMenu()
中调用BaseFragment
可能不是一个好主意,因为某些片段根本没有菜单项。为此,我创建了一个抽象函数来标识,子片段是否需要菜单,并根据结果,我用真或假调用了setHasOptionsMenu()
。但这没有帮助。
问题
什么可能是问题的原因?我为此BaseFragment
感到内?吗?该如何解决?
答案 0 :(得分:0)
确实setHasOptionsMenu()
呼叫invalidateOptionsMenu()
。我对此表示高度怀疑。
您应该在子片段中手动调用setHasOptionsMenu()
,而不要在BaseFragment
中调用它。