【发布时间】: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
}
}
这是我的子片段的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 有罪吗?如何解决问题?
【问题讨论】:
标签: android android-fragments android-menu