gpt4 book ai didi

android - 如何将可点击的 "events"操作项添加到 actionBarSherlock?

转载 作者:行者123 更新时间:2023-11-29 21:22:15 24 4
gpt4 key购买 nike

背景

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

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

类似的东西(取自 here):

enter image description here

问题

我想让它在旧的 android 版本上工作,所以我使用 actionBarSherlock。

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

我还找到了一篇关于它的帖子 ( here ) ,声称这是这个库的一个问题,但它很旧而且似乎已关闭并标记为已修复,但我找不到如何使用现在。

我尝试过的

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

  • Action 布局。显示正常,但是点击没有显示点击效果。
  • actionViewClass - 由于某种原因它甚至没有工作。
  • 以编程方式添加菜单项及其 View 。

问题

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


编辑:这是我使用 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。


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

它很好地显示了操作项,它甚至像其他操作项一样对点击使用react。

遗憾的是,我缺少一项功能 - 长按操作项以显示其标题的 toast 。遗憾的是,我找不到解决这个问题的方法,所以我所做的(有效的)是处理对 View 本身的长按,并调用用于 ActionMenuItemView::onLongClick 的类似代码.

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

我已经在此处的新答案中编写了此解决方案。

最佳答案

这是我的解决方案,但它有点困惑,并且调用了与 actionBarSherlock 中的代码相同的代码来为操作项显示 toast 。

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

菜单文件(activity_main.xml):

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

主要 Activity .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 项的布局文件(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>

关于android - 如何将可点击的 "events"操作项添加到 actionBarSherlock?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20595248/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com