背景
许多应用程序(包括google plus和facebook)都有一个操作栏项,其中显示了应用程序内事件(或“通知”)的数量。
此操作项中有一个数字,您可以单击它以显示应用程序对用户的事件。
诸如此类(取自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>