当前位置: 首页 > 知识库问答 >
问题:

工具栏菜单项在片段中单击(Kotlin)

邹英发
2023-03-14

在我的应用程序中,我有一个活动,其中包含一个FrameLayout。在这个FrameLayout中,有一个片段,包含一个ToolBar和一个RecyclView。

在这个工具栏中,我有一个搜索按钮,它应该在项目单击时启动活动。但是,当我尝试使用onOptionsItemSelected时,应用程序会成功构建和安装,但当我尝试点击该按钮时,什么也没发生。Logcat也没有说什么。

能告诉我我做错了什么吗?是否有更简单或其他简单的方法来管理工具栏上的项目单击?

<代码>片段。kt

class FragmentTrack : Fragment() {
    ...

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setHasOptionsMenu(true)
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? = inflater.inflate(R.layout.fragment_track, container, false)

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        ...

        topToolbar.setNavigationOnClickListener {
            val dialog = FragmentBottomSheetDrawer()
            dialog.show(childFragmentManager, dialog.tag)

        }
    }

    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
        inflater.inflate(R.menu.menu_toolbar, menu)
        super.onCreateOptionsMenu(menu, inflater)
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        when(item.itemId) {
            R.id.fsvSearch -> Toast.makeText(context, "Clicked search button", Toast.LENGTH_SHORT).show()
        }
        return true
    }
}

fragment.xml代码

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <com.google.android.material.appbar.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:theme="@style/Theme.Design.NoActionBar">

        <androidx.appcompat.widget.Toolbar
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/topToolbar"
            android:background="@color/colorPrimaryDark"
            app:navigationIcon="@drawable/ic_outline_menu_24"
            app:popupTheme="@style/popupMenuThemeDark"
            app:titleTextColor="@android:color/white"
            app:title="Revo"
            app:menu="@menu/menu_toolbar"
            app:layout_scrollFlags="scroll|enterAlways" />

    </com.google.android.material.appbar.AppBarLayout>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rvTracks"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:clipToPadding="false"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

<代码>工具栏\u菜单。xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
 
        <item
            android:id="@+id/fsvSearch"
            android:icon="@drawable/ic_search_24px"
            android:title="@string/search"
            app:showAsAction="always"/>
 
        <item
            android:id="@+id/fsvOrder"
            android:icon="@drawable/ic_sort_24px"
            android:title="@string/sort"
            app:showAsAction="ifRoom">
                <menu>
                        <group android:id="@+id/sortMenu" android:checkableBehavior="single">
                                <item
                                    android:id="@+id/sortIncrease"
                                    android:title="@string/increasing"/>
 
                                <item
                                    android:id="@+id/sortDecrease"
                                    android:title="@string/decreasing"/>
 
                                <item
                                    android:id="@+id/sortMArtist"
                                    android:title="@string/artist"/>
 
                                <item
                                    android:id="@+id/sortAlbum"
                                    android:title="@string/albums"/>
 
                                <item
                                    android:id="@+id/sortYear"
                                    android:title="@string/year"/>
 
                                <item
                                    android:id="@+id/sortDate"
                                    android:title="@string/date"/>
 
                        </group>
                </menu>
        </item>
 
        <item
            android:id="@+id/fsvGrid"
            android:icon="@drawable/ic_grid_on_24px"
            android:title="@string/grid"
            app:showAsAction="ifRoom">
                <menu>
                        <group android:id="@+id/gridMenu" android:checkableBehavior="single">
                                <item
                                    android:id="@+id/gridOne"
                                    android:title="1"/>
 
                                <item
                                    android:id="@+id/gridTwo"
                                    android:title="2"/>
 
                                <item
                                    android:id="@+id/gridThree"
                                    android:title="3"/>
 
                                <item
                                    android:id="@+id/gridFour"
                                    android:title="4"/>
                        </group>
                </menu>
        </item>
</menu>

共有2个答案

华安民
2023-03-14

感谢Meltix,我做了很多研究,但SO中的大多数帖子都是关于Java和老式ActionBar的。关于材质工具栏和kotlin示例的信息不多。在我的例子中,我正在开发一个主要用Java开发的旧应用程序,但现在正在Kotlin中开发新功能。在我的片段中,我无法更改ActionBar的图标和行为(我想为我的片段指定一个特定的ActionBar)。我找到的解决方案是隐藏ActionBar并创建一个工具栏,在其中扩展自定义菜单。此外,我还添加了一个后退箭头按钮(感谢John:这里)。我得出的结论是(也许我错了),你不能从kotlin片段管理ActionBars,这就是为什么你必须使用工具栏。这是我的代码,以防它能帮助别人。

我的片段。千吨级

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    // hide the old actionBar
    (activity as AppCompatActivity).supportActionBar!!.hide()
    
    // create the toolbar
    val toolbar = binding?.myToolbar
    
    // add the back arrow button, see function below
    val resId = getResIdFromAttribute(toolbar.context, android.R.attr.homeAsUpIndicator)
    toolbar.navigationIcon = ContextCompat.getDrawable(toolbar.context, resId)
    // tapping on the arrow will pop the current fragment
    toolbar.setNavigationOnClickListener { parentFragmentManager?.popBackStackImmediate() }

    // change toolbar title
    toolbar.title = "Some title"
    
    // inflate a custom menu, see code below
    toolbar.inflateMenu(R.menu.my_custom_menu)
    toolbar.setOnMenuItemClickListener {
        when (it.itemId) {
            R.id.infoButton -> someAction()
        }
        true
    }
}

// get back arrow icon
@AnyRes
fun getResIdFromAttribute(context: Context, @AttrRes attr: Int): Int {
    if (attr == 0) return 0
    val typedValueAttr = TypedValue()
    context.theme.resolveAttribute(attr, typedValueAttr, true)
    return typedValueAttr.resourceId
}

my_fragment.xml

...
<androidx.appcompat.widget.Toolbar
    android:id="@+id/myToolBar"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:visibility="visible"
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    android:background="@color/azulOscuro"
    >
</androidx.appcompat.widget.Toolbar>

my\u custom\u菜单。xml

<?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:jsmovil="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">
    <item
        android:id="@+id/infoButton"
        android:icon="@drawable/ic_info_blanco"
        android:title="@string/tutorial"
        android:textColor="@color/blanco"
        jsmovil:showAsAction="always"
        />
</menu>

后果

魏翰
2023-03-14

多亏了一些外部帮助,我找到了一个解决方案。可以以更简单的方式处理工具栏项。

onViewCreated方法中,我们必须添加

    topToolbar.inflateMenu(R.menu.menu_toolbar)

    topToolbar.setOnMenuItemClickListener {
            when(it.itemId) {
                R.id.fsvSearch -> //your code
            }
            true
        }

此外,如果菜单重复,请删除工具栏xml中的app:menu标签

 类似资料:
  • 我有一个工具栏和一个导航抽屉。当我启动应用程序时,会创建工具栏和导航抽屉。当我单击导航抽屉中的项目时,它会启动新的片段并保留相同的工具栏。当我启动特定片段时,我基本上如何向工具栏添加菜单项,例如搜索、添加、编辑?我不希望在程序开始时使用它们,而是动态创建的。还有,我怎样才能点击这些按钮,让它们启动其他片段呢。我希望在一个片段中,与另一个片段中的编辑按钮相比,工具栏中的编辑按钮可以做特定的事情。谢谢

  • 这个章节,我们会创建状态栏、菜单和工具栏。菜单是一组位于菜单栏的命令。工具栏是应用的一些常用工具按钮。状态栏显示一些状态信息,通常在应用的底部。 主窗口 QMainWindow提供了主窗口的功能,使用它能创建一些简单的状态栏、工具栏和菜单栏。 主窗口是下面这些窗口的合称,所以教程在最下方。 状态栏 状态栏是用来显示应用的状态信息的组件。 #!/usr/bin/python3 # -*- codin

  • 这个章节,我们会创建状态栏、菜单和工具栏。菜单是一组位于菜单栏的命令。工具栏是应用的一些常用工具按钮。状态栏显示一些状态信息,通常在应用的底部。 主窗口 QMainWindow 提供了主窗口的功能,使用它能创建一些简单的状态栏、工具栏和菜单栏。 主窗口是下面这些窗口的合称,所以教程在最下方。 状态栏 状态栏是用来显示应用的状态信息的组件。 #!/usr/bin/python3 # -*- codi

  • 我在中有一个可以膨胀的工具栏。我有一个名为的菜单,它会膨胀,只显示一个图标。 当用户单击打开片段时。我有另一个菜单,它有两个图标。 当我在片段中膨胀friends菜单时,它仍然显示菜单中的图标。 非常感谢您的任何建议,

  • 在这部分教程中,我们创建了一个状态栏、菜单栏和工具栏。菜单是位于菜单栏中的一组命令。工具栏有一些按钮和应用程序中的一些常用命令。状态栏显示状态信息,通常位于应用程序窗口的底部。 PyQt6 QMainWindow QMainWindow 类提供了主程序窗口。在这里可以创建一个具有状态栏、工具栏和菜单栏的经典应用程序框架。 PyQt6 状态栏 状态栏是显示状态信息的小部件。 # file: stat

  • 我今天刚刚打开了ADT(eclipse),我遇到了这个问题,我无法单击程序上方菜单栏中的任何项目。 我正在运行Mac OSX 10.9 Mavericks Dev Preview 这里是一个屏幕截图:http://i.imgur.com/9S0CjdE.png 我尝试过的事情。重启程序,重启电脑,从头重新安装ADT,不知疲倦地搜索这个问题。 任何帮助都会很棒。