【问题标题】:Hiding of the Toast for long press on actionBar item隐藏 Toast 以在 actionBar 项目上长按
【发布时间】:2013-06-28 19:17:49
【问题描述】:

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

【问题讨论】:

  • 他说的是当你长按 ActionBar 上的一个项目时自动弹出的 toast。这是 ActionBar 所做的事情,它不是他的代码的一部分。
  • 但我的意思是当你长按 ActionBar 项时吐司。我知道你可以取消普通的Toast,这不是我的问题。
  • 这是原生操作栏的一个功能。无法删除。
  • @AdaMoOo 不要忘记指南。如果您这样做,将违反操作栏设计指南
  • 更好的解决方法是:不解决,给项目标题,让Android处理项目,它们可以在某些设备上显示为溢出,标题标签确实可以帮助用户做东西。

标签: android actionbarsherlock android-actionbar toast long-press


【解决方案1】:

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

【讨论】:

  • 您好,您知道如何将文本添加到吐司中
  • 我想在长按显示的 toast 中添加一些文本
  • 不起作用,您正在谈论将其添加到
  • 长按菜单项后显示的 toast 消息是您使用 android:text="" 设置的文本。如果您想显示与此不同的其他文本,据我所知,我认为这根本不可能。
  • 嘿,不是文字,而是标题android:title=""
【解决方案2】:

可能最简洁的方法是为您的菜单项分配一个自定义操作视图,以模仿常规的外观。

既然你提到你正在使用 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。由你决定从这里拿走它。您想重新考虑并遵守这些准则。

【讨论】:

  • 嘿@MH...我的要求正好相反。我想为我的自定义操作布局项干杯。如何实现这一目标。
  • @MahendraChhimwal:我想您可以在操作项的 on(long)click 中显示祝酒词。 Toast 可以完全自定义并显示在屏幕上的任何位置,因此您应该能够复制默认的 toast 行为(提示:只需在框架的源代码中获取峰值)。
  • :感谢您的建议,是的(提示:只是在框架的源代码中达到顶峰)对于像我这样的新手开发人员来说是一个很好的提示(以及提示)。再次感谢。
【解决方案3】:

您可以修改onLongClickin ActionMenuItemView Class 以停止长按 Toasting。
但要小心,它只适用于 API 小于 11 的设备,因为 sherlockactionbar 库通过Build.VERSION.SDK_INT 检查您的设备 API 级别,如果您有较新的设备,它只使用您未修改的默认系统操作栏。

【讨论】:

    【解决方案4】:

    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;
                        }
                    });
                }
            }
        });
    }
    

    【讨论】:

    • 它很脏,它在工作,它很脏!感谢您的提示!
    【解决方案5】:

    这就是我的做法:

    @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 出现在错误的一侧!老实说,我很着急,没有找到原因,但如果有人让我知道原因,我将不胜感激,反正我就是这样度过的。

    【讨论】:

      【解决方案6】:

      您可以通过使用以下自定义操作视图来实现此目的:

      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);
          }
      

      【讨论】:

      • 是否可以为动作视图吐司?
      【解决方案7】:

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

      【讨论】:

        【解决方案8】:

        对我来说,解决方案是:

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

        【讨论】:

          【解决方案9】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-03-12
            • 1970-01-01
            • 2012-11-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多