可以在Kotlin上显示/隐藏菜单项 - Android Studio

发布于 2025-01-28 22:10:26 字数 3127 浏览 2 评论 0原文

我的应用程序包含3个选项的菜单,我想要的是,根据我定义的条件,仅显示2个选项,或显示3个选项。 我尝试了我在Google和这里找到的所有选项,但是没有一个对我有用的选择。

我的想法是,一旦创建了视图,菜单就已经显示了可以根据条件显示的选项。但是,由于我能够实现它,因此我添加了一个按钮来模拟事件。

非常感谢您的帮助。

在这里我附加代码:

1)activity_home.xml(某些部分)

    <Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Button"
    android:onClick="ActivarMenus"/>

<androidx.appcompat.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary"
    android:minHeight="?attr/actionBarSize"

    app:menu="@menu/home_menu"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" >

2)aqui el Archivo home_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/menu_item"
        android:icon="@drawable/ic_baseline_more_vert_24"
        app:showAsAction="ifRoom"
        tools:ignore="MenuTitle">
        <menu>
            <item
                android:id="@+id/newRegister"
                android:icon="@drawable/ic_baseline_add_24"
                app:showAsAction="always"
                android:visible="true"
                android:title="Nueva Orden Swab" />
            <item
                android:id="@+id/newAnexoo"
                android:icon="@drawable/ic_baseline_add_24"
                app:showAsAction="always"
                android:visible="true"
                android:title="Nuevo Formulario Anexo O" />
            <item
                android:id="@+id/sync"
                android:icon="@drawable/ic_baseline_sync_24"
                app:showAsAction="always"
                android:visible="true"
                android:title="Sincronizar" />
        </menu>
    </item>
</menu>

3)和一部分homeactivity.kt

class HomeActivity : ActivityViewBinding<ActivityHomeBinding, HomeVM>() {

private var mainMenu: Menu? = null

private lateinit var spm : SharedPreferencesManager

private val adapter: OrderAdapter by inject()
override fun inflateLayout(layoutInflater: LayoutInflater) =
    ActivityHomeBinding.inflate(layoutInflater)


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

    setContentView(R.layout.activity_home)
    //MenuMain.findItem(R.id.newAnexoo).isVisible   = true

}

override fun onCreateOptionsMenu(menu: Menu): Boolean {

    val inflater: MenuInflater = menuInflater
    inflater.inflate(R.menu.home_menu, menu)
    mainMenu = menu;
    return true
}

fun ActivarMenus(view: View) {
    mainMenu?.findItem(R.id.newRegister)?.isVisible   = true

}

my application has a menu of 3 options, and what I want is that according to a condition that I define, it shows only 2 options, or it shows 3.
I have tried all the options that I have found on google and here, but none have worked for me.

My idea is that as soon as the view is created, the menu already shows the options that it can show according to the condition. But as I have been able to achieve it, I added a button to simulate the event.

I would greatly appreciate your help.

Here I attach the code:

1) activity_home.xml (some part)

    <Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Button"
    android:onClick="ActivarMenus"/>

<androidx.appcompat.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary"
    android:minHeight="?attr/actionBarSize"

    app:menu="@menu/home_menu"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" >

2) Aqui el archivo home_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/menu_item"
        android:icon="@drawable/ic_baseline_more_vert_24"
        app:showAsAction="ifRoom"
        tools:ignore="MenuTitle">
        <menu>
            <item
                android:id="@+id/newRegister"
                android:icon="@drawable/ic_baseline_add_24"
                app:showAsAction="always"
                android:visible="true"
                android:title="Nueva Orden Swab" />
            <item
                android:id="@+id/newAnexoo"
                android:icon="@drawable/ic_baseline_add_24"
                app:showAsAction="always"
                android:visible="true"
                android:title="Nuevo Formulario Anexo O" />
            <item
                android:id="@+id/sync"
                android:icon="@drawable/ic_baseline_sync_24"
                app:showAsAction="always"
                android:visible="true"
                android:title="Sincronizar" />
        </menu>
    </item>
</menu>

3) And a part of the HomeActivity.kt

class HomeActivity : ActivityViewBinding<ActivityHomeBinding, HomeVM>() {

private var mainMenu: Menu? = null

private lateinit var spm : SharedPreferencesManager

private val adapter: OrderAdapter by inject()
override fun inflateLayout(layoutInflater: LayoutInflater) =
    ActivityHomeBinding.inflate(layoutInflater)


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

    setContentView(R.layout.activity_home)
    //MenuMain.findItem(R.id.newAnexoo).isVisible   = true

}

override fun onCreateOptionsMenu(menu: Menu): Boolean {

    val inflater: MenuInflater = menuInflater
    inflater.inflate(R.menu.home_menu, menu)
    mainMenu = menu;
    return true
}

fun ActivarMenus(view: View) {
    mainMenu?.findItem(R.id.newRegister)?.isVisible   = true

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

时光与爱终年不遇 2025-02-04 22:10:26

您应该尝试使用此操作。

如果要在运行时更改菜单项,则可以使用onprepareoptionsmenu

@Override
public boolean onPrepareOptionsMenu(Menu menu){

    if (//Your condition) {
        menu.findItem(R.id.newRegister).setVisible(true);
    }else {
        menu.findItem(R.id.newRegister).setVisible(false);
    }
    return true;
} 

You should try this one it might be work.

if you want to change Menu Items at Run time You can use onPrepareOptionsMenu

@Override
public boolean onPrepareOptionsMenu(Menu menu){

    if (//Your condition) {
        menu.findItem(R.id.newRegister).setVisible(true);
    }else {
        menu.findItem(R.id.newRegister).setVisible(false);
    }
    return true;
} 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文