Android 工具栏菜单OnOptions ItemSelected无法从片段中工作
当用户使用导航组件单击工具栏中的菜单时,我试图更改当前片段,但是我根本无法从片段中获得菜单!我使用的是带有2个片段的底部导航栏,每个片段都有不同的工具栏菜单项,我没有使用导航抽屉。 以下是HomeFragment.kt中的一个小片段:Android 工具栏菜单OnOptions ItemSelected无法从片段中工作,android,android-toolbar,android-architecture-navigation,Android,Android Toolbar,Android Architecture Navigation,当用户使用导航组件单击工具栏中的菜单时,我试图更改当前片段,但是我根本无法从片段中获得菜单!我使用的是带有2个片段的底部导航栏,每个片段都有不同的工具栏菜单项,我没有使用导航抽屉。 以下是HomeFragment.kt中的一个小片段: override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? )
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
activity?.title = getString(R.string.title_home)
setHasOptionsMenu(true)
return inflater.inflate(R.layout.fragment_home, container, false)
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.toolbar_menu, menu)
super .onCreateOptionsMenu(menu, inflater)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.toolbar_about -> {
activity?.findNavController(R.id.bottom_nav_host)?.navigate(R.id.toAboutFragment)
Toast.makeText(context, "You clicked on About menu", Toast.LENGTH_SHORT).show()
}
else -> super.onOptionsItemSelected(item)
}
return true
}
它甚至没有显示我指定的祝酒词。有人能帮我吗?提前谢谢 您可以打开主机活动的菜单。如果您想在片段上打开它,可以使用上下文。检查下面的代码
public class FragmentEditProfile extends Fragment {
Context m_context; //Context
public static FragmentEditProfile newInstance() {
return new FragmentEditProfile();
}
@Override
public void onCreate(Bundle savedInstanceState) {
// Get context of host activity.
m_context = getContext();
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View fragmentLayout = inflater.inflate(R.layout.fragment_profile_edit, container, false);
// setNavigationOnClickListener of the host activity.
((MainActivity)m_context).toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Open the menu using context of host activity
((MainActivity) m_context).openDrawer();
}
});
return fragmentLayout;
}
}
如果你有任何问题,请告诉我。希望能有所帮助。我通过直接从activity而不是fragment调用onOptions ItemSelected来解决这个问题。因此,我的最终代码如下所示:
HomeFragment.kt
:
//We set menu from fragment
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.toolbar_menu, menu)
super .onCreateOptionsMenu(menu, inflater)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
val navHost = findNavController(R.id.bottom_nav_host)
when (item.itemId) {
android.R.id.home -> {
onBackPressed()
return true
}
//This one is for our fragment toolbar menu
R.id.toolbar_about -> {
navHost.navigate(R.id.toAboutFragment)
return true
}
}
return false
}
MainActivity.kt
:
//We set menu from fragment
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.toolbar_menu, menu)
super .onCreateOptionsMenu(menu, inflater)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
val navHost = findNavController(R.id.bottom_nav_host)
when (item.itemId) {
android.R.id.home -> {
onBackPressed()
return true
}
//This one is for our fragment toolbar menu
R.id.toolbar_about -> {
navHost.navigate(R.id.toAboutFragment)
return true
}
}
return false
}
有几件事可能需要检查 1) 风格应用程序主题
<resources>
<style name="AppThem
parent="Theme.AppCompat.Light.DarkActionBar"> .....
这可能与您的主机活动有关-您在哪里将supportActionBar设置为工具栏?-您的活动或片段是哪种布局包含菜单应添加到的工具栏?我在MainActivity(这是除Splashscreenactivity和baseactivity(用于主题和语言)之外的唯一活动)中设置了supportActionBar。在Create方法中,包含工具栏的布局是activity_main.xmlHi,我想我没有具体说明一些事情,我的错。我并没有抽屉,我只有一个菜单项,可以使用导航组件替换当前片段。我已经直接从片段设置了菜单项(我想在不同的片段上有不同的工具栏菜单),但无论出于什么原因,单击该菜单项都不起作用。我正在使用底部导航栏BTWfFragment无法覆盖活动的函数。我建议您使用主机活动的上下文。((MainActivity)m_context)。一旦创建选项菜单(),您可以这样使用。谢谢,如果您有任何问题,我会尝试的,请告诉我。祝你成功!
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.menu_collections_new, menu)
super.onCreateOptionsMenu(menu, inflater)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.men_item1-> onSignOutClicked( "item1")
R.id.men_item2 -> onSignOutClicked("item2")
R.id.men_item3 ->onSignOutClicked("item3")
}
return super.onOptionsItemSelected(item)
private fun onSignOutClicked(description:String) {
Log.d(TAG,"dja 193 options menu selected $description")
}