为什么在显示/隐藏Fragment后,Fragment的菜单项会消失,混合或替换其他项目?

时间:2018-08-16 08:50:15

标签: android android-fragments android-menu

问题描述

我有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;
    }
  }

我尝试过的事情

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

问题 什么可能是问题的原因?我为此BaseFragment感到内?吗?该如何解决?

1 个答案:

答案 0 :(得分:0)

确实setHasOptionsMenu()呼叫invalidateOptionsMenu()。我对此表示高度怀疑。

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