为什么上下文菜单不适用于 android kotlin?
Why context menu not work for android kotlin?
我有一个简单的 android 应用程序,在我的应用程序中,有一个图像图标,当我单击该图标时,我想显示上下文菜单。我的代码正在调试,但是当我单击图像按钮时,没有任何变化,因此上下文菜单不起作用,我不知道问题出在哪里,任何想法将不胜感激。
菜单片段:
class MenuFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_menu, container, false)
popupMenu()
}
private fun popupMenu() {
val popupMenu = PopupMenu(requireContext(), menu)
popupMenu.inflate(R.menu.menu)
popupMenu.setOnMenuItemClickListener {
when(it.itemId) {
R.id.menu_one -> {
Toast.makeText(requireContext(), "menu1", Toast.LENGTH_SHORT).show()
true
}
R.id.menu_two -> {
Toast.makeText(requireContext(), "menu2", Toast.LENGTH_SHORT).show()
true
}
else -> true
}
}
menu.setOnLongClickListener {
try {
val popup = PopupMenu::class.java.getDeclaredField("mPopup")
popup.isAccessible = true
val menu = popup.get(popupMenu)
menu.javaClass
.getDeclaredMethod("setForceShowIcon",Boolean::class.java)
.invoke(menu, true)
}catch(e: Exception) {
e.printStackTrace()
}finally {
popupMenu.show()
}
true
}
}
}
fragment_menu:
<ImageView
android:id="@+id/menu"
android:layout_width="wrap_content"
android:layout_height="16dp"
android:src="@drawable/ic_menu"
android:text="5:33 PM"
android:textSize="12sp"
/>
菜单:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menu_one"
android:title="Menu1"
android:icon="@drawable/ic_menu_one"
/>
<item
android:id="@+id/menu_two"
android:title="Menu2"
android:icon="@drawable/ic_menu_two"
/>
您似乎想尽快显示菜单,因为函数调用是在 return 语句之后,所以它永远不会发生。
您必须利用片段生命周期。覆盖 onViewCreated
并在那里调用它
override... onViewCreated(...) {
super....
popUpMenu()
}
方法 onViewCreated
在创建视图后立即发生。如果您在视图准备好交互时需要它 onStart
。在这两种情况下,确保向后导航不会再次错误地显示它。
我有一个简单的 android 应用程序,在我的应用程序中,有一个图像图标,当我单击该图标时,我想显示上下文菜单。我的代码正在调试,但是当我单击图像按钮时,没有任何变化,因此上下文菜单不起作用,我不知道问题出在哪里,任何想法将不胜感激。
菜单片段:
class MenuFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_menu, container, false)
popupMenu()
}
private fun popupMenu() {
val popupMenu = PopupMenu(requireContext(), menu)
popupMenu.inflate(R.menu.menu)
popupMenu.setOnMenuItemClickListener {
when(it.itemId) {
R.id.menu_one -> {
Toast.makeText(requireContext(), "menu1", Toast.LENGTH_SHORT).show()
true
}
R.id.menu_two -> {
Toast.makeText(requireContext(), "menu2", Toast.LENGTH_SHORT).show()
true
}
else -> true
}
}
menu.setOnLongClickListener {
try {
val popup = PopupMenu::class.java.getDeclaredField("mPopup")
popup.isAccessible = true
val menu = popup.get(popupMenu)
menu.javaClass
.getDeclaredMethod("setForceShowIcon",Boolean::class.java)
.invoke(menu, true)
}catch(e: Exception) {
e.printStackTrace()
}finally {
popupMenu.show()
}
true
}
}
}
fragment_menu:
<ImageView
android:id="@+id/menu"
android:layout_width="wrap_content"
android:layout_height="16dp"
android:src="@drawable/ic_menu"
android:text="5:33 PM"
android:textSize="12sp"
/>
菜单:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menu_one"
android:title="Menu1"
android:icon="@drawable/ic_menu_one"
/>
<item
android:id="@+id/menu_two"
android:title="Menu2"
android:icon="@drawable/ic_menu_two"
/>
您似乎想尽快显示菜单,因为函数调用是在 return 语句之后,所以它永远不会发生。
您必须利用片段生命周期。覆盖 onViewCreated
并在那里调用它
override... onViewCreated(...) {
super....
popUpMenu()
}
方法 onViewCreated
在创建视图后立即发生。如果您在视图准备好交互时需要它 onStart
。在这两种情况下,确保向后导航不会再次错误地显示它。