17

长按 ActionBar 项目后如何隐藏吐司?我没有为该项目设置标题,但它仍然存在 - 空吐司。

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

4

9 回答 9

6

隐藏 toast 的唯一方法是将ActionBar菜单项设置为与文本一起显示。android:showAsAction="withText". 否则,即使没有为菜单项设置标题,吐司也会澄清每个操作项所代表的内容。

于 2013-07-17T10:36:45.897 回答
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" />

结果是一个看起来像溢出按钮的菜单项,当你长按它时不显示Toast消息,无论是使用原生 ActionBar 还是 ABS。由你决定从这里拿走它。您想重新考虑并遵守这些准则。

于 2013-07-18T22:36:48.187 回答
5

您可以onLongClickActionMenuItemView类中进行修改以在长按时停止 Toasting。
但要小心,它仅适用于 API 小于 11 的设备,因为 sherlockactionbar 库会检查您的设备 API 级别Build.VERSION.SDK_INT,如果您有较新的设备,它只会使用您未修改的默认系统操作栏。

于 2013-07-23T14:13:10.417 回答
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;
                    }
                });
            }
        }
    });
}
于 2016-07-22T07:38:40.500 回答
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在工具栏中正确显示。

PS:我个人更喜欢默认行为,但这是我的情况:我禁用了对我的应用程序的从右到左的支持,之后当我将默认语言环境设置为rtl语言时,toast 出现在错误的一侧!老实说,我很着急,没有找到原因,但如果有人让我知道原因,我将不胜感激,无论如何这就是我通过的方式。

于 2017-07-10T20:25:31.677 回答
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);
    }
于 2013-12-26T10:59:34.553 回答
0

您可以尝试创建自己的自定义ActionBar。这是有关如何执行此操作的教程: 自定义操作栏

于 2013-07-18T15:29:38.103 回答
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;
}
于 2017-08-08T09:43:05.420 回答
-2

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

于 2013-10-19T20:28:55.787 回答