背景

许多应用程序(包括google plusfacebook)都有一个操作栏项,其中显示了应用程序内事件(或“通知”)的数量。

此操作项中有一个数字,您可以单击它以显示应用程序对用户的事件。

诸如此类(取自here):



问题

我希望它可以在旧的android版本上运行,所以我使用actionBarSherlock。

可悲的是,我使用的每个解决方案都有其缺点,在这里(在stackOverflow上)找不到任何可以通过actionBarSherlock来解决此问题的解决方案(找到了其他解决方案,但没有使用此库)。

我还找到了有关它的文章(here),声称它是该库中的一个问题,但是它很旧,似乎已关闭并标记为已修复,但现在找不到如何使用它。

我尝试过的

我已经尝试了下一个解决方案:


actionLayout。它显示的很好,但是单击它并没有显示单击效果。
actionViewClass-由于某种原因,它甚至无法正常工作。
以编程方式添加菜单项及其视图。


问题

实现此目标的最佳方法是什么?



编辑:这就是我尝试使用actionLayout的内容:

“ action_item_notification.xml”-现在与“ abs__action_menu_item_layout.xml”(here)相同。稍后,我将添加一个textView来保存通知数量。

在菜单xml文件中,我将此作为以下项目之一:

<item
android:id="@+id/activity_main__menuItem_notifications"
android:actionLayout="@layout/action_item_notification"
android:icon="@drawable/notification_button"
android:showAsAction="always"
android:title="@string/notifications"/>


不仅它不显示图标,而且长时间单击该项目还会使该应用程序崩溃,并在ActionMenuItemView.java文件上显示NPE。



编辑:好的,所以我找到了几乎完美的解决方案。

它很好地显示了该操作项,甚至像其他操作项一样对单击做出了反应。

可悲的是,我缺少一项功能-长时间单击动作项以显示其标题。可悲的是,我找不到解决该问题的方法,所以我所做的(有效的)正在处理视图本身的长按,并调用用于ActionMenuItemView :: onLongClick的类似代码。

如果有人有更好更好的解决方案,请写下来。

我在这里用新的答案写了这个解决方案。

最佳答案

这是我的解决方案,但是有点混乱,并且调用了与actionBarSherlock相同的代码来显示动作项的吐司。

如果有人有更好,更清洁的解决方案,请写下来。

菜单文件(activity_main.xml):

...
<item
    android:id="@+id/activity_main__menuItem_notifications"
    android:showAsAction="always"
    android:title="@string/notifications"/>
...


MainActivity.java:

public boolean onCreateOptionsMenu(...){
...
getSupportMenuInflater().inflate(R.menu.activity_main, menu);
//
final MenuItem notificationsMenuItem = menu.findItem(R.id.activity_main__menuItem_notifications);
notificationsMenuItem.setActionView(R.layout.action_item_notification);
setEnableLongClickOnCustomActionItem(notificationsMenuItem,true);
...
public static void setEnableLongClickOnCustomActionItem(final MenuItem menuItem, final boolean enable) {
    final View actionView = menuItem.getActionView();
    if (actionView == null)
        return;
    final CharSequence title = menuItem.getTitle();
    if (!enable || Strings.isEmpty(title))
        actionView.setOnLongClickListener(null);
    actionView.setOnLongClickListener(new OnLongClickListener() {

        @Override
        public boolean onLongClick(final View v) {
            final int[] screenPos = new int[2];
            final Rect displayFrame = new Rect();
            actionView.getLocationOnScreen(screenPos);
            actionView.getWindowVisibleDisplayFrame(displayFrame);

            final Context context = actionView.getContext();
            final int width = actionView.getWidth();
            final int height = actionView.getHeight();
            final int midy = screenPos[1] + height / 2;
            final int screenWidth = context.getResources().getDisplayMetrics().widthPixels;

            final Toast cheatSheet = Toast.makeText(context, title, Toast.LENGTH_SHORT);
            if (midy < displayFrame.height()) {
                // Show along the top; follow action buttons
                cheatSheet.setGravity(Gravity.TOP | Gravity.RIGHT, screenWidth - screenPos[0] - width / 2, height);
            } else {
                // Show along the bottom center
                cheatSheet.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, height);
            }
            cheatSheet.show();
            return true;
        }
    });


操作项的布局文件(action_item_notification.xml):

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    style="?attr/actionButtonStyle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:addStatesFromChildren="true"
    android:focusable="true" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:adjustViewBounds="true"
        android:background="@null"
        android:focusable="false"
        android:scaleType="fitCenter"
        android:src="@drawable/notification_button" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/imageView1"
        android:layout_alignRight="@+id/imageView1"
        android:background="@drawable/action_item_notification_counter_background"
        android:paddingLeft="1dp"
        android:paddingRight="1dp"
        android:text="88"
        android:textColor="#FFffffff"
        tools:ignore="HardcodedText" />

</RelativeLayout>


还有一个用于textView背景的漂亮的可绘制对象(“ action_item_notification_counter_background.xml”):

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval" >

    <solid android:color="#FFff0000" />

</shape>

07-24 09:26