Android 工具栏菜单OnOptions ItemSelected无法从片段中工作

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?​ )​

当用户使用导航组件单击工具栏中的菜单时,我试图更改当前片段,但是我根本无法从片段中获得菜单!我使用的是带有2个片段的底部导航栏,每个片段都有不同的工具栏菜单项,我没有使用导航抽屉。 以下是HomeFragment.kt中的一个小片段:

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")
     }