在ActionBar项目上长按时隐藏Toast

18

有没有可能在ActionBar项上长按后隐藏Toast?我没有为该项设置标题,但它仍然存在-空的Toast。

有没有办法在ActionBar项上长按后隐藏Toast?即使我没有为该项设置标题,但仍会出现一个空的Toast提示。

<item
    android:id="@+id/ab_main_menu_dots"
    android:icon="@drawable/action_icons_dots"
    android:showAsAction="always">
    <menu>
        <item
            android:id="@+id/ab_main_menu_my_profile"
            android:showAsAction="never"
            android:title="@string/ab_my_profile">
        </item>
        <item
            android:id="@+id/ab_main_menu_settings"
            android:showAsAction="never"
            android:title="@string/menu_settings">
        </item>
        <item
            android:id="@+id/ab_main_menu_help"
            android:showAsAction="never"
            android:title="@string/tv_help_login">
        </item>
        <item
            android:id="@+id/ab_main_menu_about_us"
            android:showAsAction="never"
            android:title="@string/ab_about_us">
        </item>
        <item
            android:id="@+id/ab_main_menu_logout"
            android:showAsAction="never"
            android:title="@string/bt_logout_main">
        </item>
    </menu>
</item>

需要翻译的内容为:


7
他谈论的是当你在ActionBar上长按某个项目时自动弹出的提示。这是ActionBar的功能,不是他的代码的一部分。 - Karakuri
看起来你正在尝试模仿溢出菜单。为什么不直接使用实际的溢出菜单呢? - Karakuri
1
这是本地操作栏的一个功能。它无法被移除。 - ramin eftekhari
4
@AdaMoOo 不要忘记指南。如果你这样做将违反操作栏设计指南。 - Dinesh T A
1
更好的解决方法是:不要解决,为项目提供标题,让Android处理项目,它们可以在某些设备上显示为溢出,并且标题标签有助于用户完成操作。 - Marcos Vasconcelos
显示剩余6条评论
9个回答

6
唯一隐藏toast的方法是将ActionBar菜单项设置为显示文本android:showAsAction="withText"。否则,即使未为菜单项设置标题,toast也会添加每个操作项表示的说明。

你好,你有没有想过如何将文本添加到Toast中呢? - Prateek
我想在长按时显示的提示中添加一些文本。 - Prateek
无法工作,您是在谈论将此添加到<item nodes>中。 - Prateek
长按菜单项后显示的弹出消息是使用 android:text="" 设置的文本。如果想要显示与此不同的文本,据我所知,这根本不可能。 - hardartcore
嘿,这不是文本,而是标题 android:title = "" - Prateek
抱歉我的不好,但那是你可以放入menuItem的唯一文本。 - hardartcore

5
onCreateOptionsMenu中,安排一个任务来禁用所需菜单项上的长按功能。以下是示例:
    @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {

    inflater.inflate(R.menu.my_menu, menu);
    new Handler().post(new Runnable() {
        @Override
        public void run() {
            final View v = getActivity().findViewById(R.id.your_menu_item);
            if (v != null) {
                v.setOnLongClickListener(new View.OnLongClickListener() {
                    @Override
                    public boolean onLongClick(View v) {
                        return false;
                    }
                });
            }
        }
    });
}

1
它看起来有点脏,但是它还在工作,所以我们可以说这是一种"脏工作"。感谢您的建议! - Jonathan ANTOINE

5

可能最干净的方法是将自定义操作视图分配给菜单项,模仿常规菜单项的外观。

由于您提到正在使用ActionBarSherlock,这里是一个简单的示例。

想象一下以下的 menu.xml,它在Activity中被填充。

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:id="@+id/ab_main_menu_dots"
        android:actionLayout="@layout/ab_main_menu_dots_layout"
        android:showAsAction="always"/>
</menu>

你可以定义 ab_main_menu_dots_layout.xml 文件来模仿溢出按钮的效果,如下所示:
<ImageButton xmlns:android="http://schemas.android.com/apk/res/android"
    style="@style/Widget.Sherlock.ActionButton.Overflow"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

结果是一个菜单项,看起来像一个溢出按钮,并且无论是使用本地ActionBar还是ABS,长按它都不会显示Toast消息。接下来由您决定如何处理。建议您重新考虑并遵守指南。

1
嘿 @MH... 我的需求恰好相反。我想在我的自定义操作布局项上弹出一个 Toast。如何实现这个? - Mahendra Chhimwal
@MahendraChhimwal:我猜你可以在操作项的on(long)click中显示一个toast。Toast可以完全自定义并显示在屏幕的任何位置,因此您应该能够复制默认的toast行为(提示:只需查看框架源代码即可)。 - MH.
谢谢您的建议,而且确实(提示:只需查看框架的源代码)是一个对像我这样的新手开发人员非常好的提示(和技巧)。再次感谢。 - Mahendra Chhimwal

5
你可以修改ActionMenuItemView类中的onLongClick方法来停止长按时的提示。
但是要小心,这仅适用于API级别低于11的设备,因为SherlockActionBar库会通过Build.VERSION.SDK_INT检查你的设备API级别,如果你有更新的设备,它将使用默认的系统ActionBar,而不是你正在修改的ActionBar。

3
这是我做的方法:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_main, menu);
    MenuItem item = menu.findItem(R.id.no_toast);
    item.setActionView(R.layout.custom_view);
    item.getActionView().setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //handle click (just this item)
        }
    });
    return true;
}

这是我的菜单:

<?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:title="Never gonna see me in a toast!"
        app:showAsAction="always"
        android:id="@+id/no_toast" />
</menu>

我的自定义视图只是一个 ImageButton

<?xml version="1.0" encoding="utf-8"?>
<ImageButton xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    style="@style/Widget.AppCompat.Toolbar.Button.Navigation"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:src="@drawable/icon" />

注意: 不要忘记设置样式,Widget.AppCompat.Toolbar.Button.Navigation 可以使 IamgeButton 在工具栏中正确显示。

附言: 个人而言,我更喜欢默认行为,但这是我的情况: 我禁用了应用程序的从右到左支持,之后当我将默认语言环境设置为 rtl 语言时,toast 显示在错误的位置!老实说,我很匆忙,没有找出原因,但如果有人能告诉我原因,我会非常感激,无论如何,这就是我通过的方式。


1
您可以通过使用自定义操作视图来实现此目的,如下所示:
action_menu.xml
    <menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:support="http://schemas.android.com/apk/res-auto" >

    <item
        android:id="@+id/item1"
        support:showAsAction="always">
    </item>

</menu>

custom_action_view.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="10dp"
        android:paddingRight="5dp" >

    <ImageButton
        android:id="@+id/customActionItem"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:background="@drawable/abc_item_background_holo_dark"
        android:src="@drawable/bulb_icon" />

    </RelativeLayout>

菜单膨胀器的代码如下:

    public boolean onCreateOptionsMenu(Menu menu) {
        // TODO Auto-generated method stub
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.action_menu, menu);     

        final MenuItem item1= menu.findItem(R.id.item1);
        MenuItemCompat.setActionView(item1, R.layout.custom_action_view);
        View vItem1= MenuItemCompat.getActionView(item1);

        final ImageButton customActionItem= (ImageButton) vItem1.findViewById(R.id.customActionItem);
        customActionItem.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                // do something here
            }
        });

        return super.onCreateOptionsMenu(menu);
    }

有没有可能为操作视图设置提示信息(Toast)? - android developer

0
你可以尝试创建自己的定制ActionBar。这里有一个关于如何实现的教程:自定义操作栏

0

对我来说,解决方案是使用:

android.support.v4.view.MenuItemCompat

所以,不要从XML中膨胀菜单:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.refresh_menu, menu);
    return true;
}

我使用MenuItemCompat编程方式创建了这些项目:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuItem refreshItem = menu.add(Menu.NONE, R.id.menu_item_refresh, Menu.NONE, R.string.general_pop_up_dialog_btn_cancel);
    MenuItemCompat.setActionView(refreshItem, R.layout.actionbar_custom_view_refresh);
    MenuItemCompat.setShowAsAction(refreshItem, MenuItemCompat.SHOW_AS_ACTION_ALWAYS);
    return true;
}

-2

如果您正在使用ActionBarSherlock,有一种方法。在库中找到ActionMenuItemView.java文件,然后注释掉整个onLongClick方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接