簡體   English   中英

單擊片段中的工具欄菜單項 (Kotlin)

[英]ToolBar menu item click in a fragment (Kotlin)

在我的應用程序中,我有一個 Activity,其中有一個 FrameLayout。 在這個 FrameLayout 中,有一個片段,包含一個 ToolBar 和一個 RecyclerView。

在這個工具欄中,我有一個搜索按鈕,它應該在項目點擊時啟動一個活動。 但是,當我嘗試使用 onOptionsItemSelected 時,應用程序已成功構建和安裝,但是當我嘗試點擊有問題的按鈕時,沒有任何反應。 Logcat,也沒有說什么。

可以指出我做錯了什么嗎? 是否有更簡單或其他簡單的方法來管理工具欄項目的點擊?

Fragment.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>

toolbar_menu.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>

由於一些外部幫助,我找到了解決方案。 可以更輕松地處理工具欄項目。

onViewCreated方法中,我們必須添加:

    topToolbar.inflateMenu(R.menu.menu_toolbar)

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

此外,如果菜單重復,請刪除工具欄 xml 中的app:menu標記

感謝 Meltix 為此,我做了很多研究,但 SO 中的大部分帖子都是關於 Java 和老式的 ActionBar。 關於材料工具欄和kotlin示例的信息不多。 在我的例子中,我正在開發一個主要在 Java 中開發的舊應用程序,但現在在 Kotlin 中開發新功能。在我的片段中,我無法更改 ActionBar 的圖標和行為(我想要一個特定的 ActionBar 作為我的片段)。 我找到的解決方案是隱藏 ActionBar 並創建一個工具欄以在其中擴展自定義菜單。 我還添加了一個后退箭頭按鈕(感謝 John: here )。 我得出的結論(也許我錯了)您無法管理來自 kotlin 個片段的 ActionBar,這就是您必須使用工具欄的原因。 這是我的代碼,以防它可以幫助某人。

我的片段.kt

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
}

我的片段.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_custom_menu.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>

結果

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM