Toolbar fragment onoptionsitemselected not called kotlin,有几种方案推荐什么?
Toolbar fragment onoptionsitemselected not called kotlin, several solutions what is the recomended?
我在尝试控制片段中选项菜单的 onclick 时迷路了。解决办法太多了,不知道从何下手
我看到有些地方有人告诉我们使用 NavController,其他人告诉我们在 activity 和片段中都使用 onOptionsItemSelected 并覆盖您需要的内容。最重要的是,我们有甚至不需要充气的 androidx.appcompat.widget.Toolbar,只需在 XML 文件中使用 app:menu= 即可,但我如何听到点击声?
<androidx.appcompat.widget.Toolbar
app:menu="@menu/menu_fragment_main">
我让它在 activity 中工作,但后来不得不使用片段来代替并陷入困境,我只希望菜单像在 activity 中一样工作。
您需要在fragment的onCreate()方法中调用setHasOptionsMenu:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
以下是如何展开菜单并响应点击:
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu, menu);
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.refresh:
//Respond to click
break;
}
return true;
}
这是你的 menu.xml :
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/refresh" android:title="Refresh" android:icon="@drawable/ic_action_refresh" />
</menu>
val toolbar = fragmentInflater.findViewById<androidx.appcompat.widget.Toolbar>(R.id.toolbarMainActivity)
(activity as AppCompatActivity).setSupportActionBar(toolbar)
这解决了问题,现在有点累了,但我会在后面评论为什么会这样。
我认为这是 xml、androidx 中工具栏的一些混合,非 androidx 工具栏的错误导入等等。
在示例中,创建了一个 overflow_menu 并连接到 AboutMe activity/fragment。它使用导航方向转到关于我的页面 -
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/about"
android:title="@string/about" />
</menu>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main_activity)
setHasOptionsMenu(true)
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
super.onCreateOptionsMenu(menu, inflater)
inflater.inflate(R.menu.overflow_menu, menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.about -> navigateAbout(item)
}
return super.onOptionsItemSelected(item)
}
private fun navigateAbout(item: MenuItem) {
view!!.findNavController()
.navigate(TitleFragmentDirections.actionTitleFragmentToAboutFragment())
}
我在尝试控制片段中选项菜单的 onclick 时迷路了。解决办法太多了,不知道从何下手
我看到有些地方有人告诉我们使用 NavController,其他人告诉我们在 activity 和片段中都使用 onOptionsItemSelected 并覆盖您需要的内容。最重要的是,我们有甚至不需要充气的 androidx.appcompat.widget.Toolbar,只需在 XML 文件中使用 app:menu= 即可,但我如何听到点击声?
<androidx.appcompat.widget.Toolbar
app:menu="@menu/menu_fragment_main">
我让它在 activity 中工作,但后来不得不使用片段来代替并陷入困境,我只希望菜单像在 activity 中一样工作。
您需要在fragment的onCreate()方法中调用setHasOptionsMenu:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
以下是如何展开菜单并响应点击:
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu, menu);
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.refresh:
//Respond to click
break;
}
return true;
}
这是你的 menu.xml :
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/refresh" android:title="Refresh" android:icon="@drawable/ic_action_refresh" />
</menu>
val toolbar = fragmentInflater.findViewById<androidx.appcompat.widget.Toolbar>(R.id.toolbarMainActivity)
(activity as AppCompatActivity).setSupportActionBar(toolbar)
这解决了问题,现在有点累了,但我会在后面评论为什么会这样。
我认为这是 xml、androidx 中工具栏的一些混合,非 androidx 工具栏的错误导入等等。
在示例中,创建了一个 overflow_menu 并连接到 AboutMe activity/fragment。它使用导航方向转到关于我的页面 -
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/about"
android:title="@string/about" />
</menu>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main_activity)
setHasOptionsMenu(true)
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
super.onCreateOptionsMenu(menu, inflater)
inflater.inflate(R.menu.overflow_menu, menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.about -> navigateAbout(item)
}
return super.onOptionsItemSelected(item)
}
private fun navigateAbout(item: MenuItem) {
view!!.findNavController()
.navigate(TitleFragmentDirections.actionTitleFragmentToAboutFragment())
}