如何在 ActionBar 图标上获取文本?
Posted
技术标签:
【中文标题】如何在 ActionBar 图标上获取文本?【英文标题】:How to get text on an ActionBar Icon? 【发布时间】:2012-10-28 15:30:52 【问题描述】:我想要这样的东西:
第三个图标用于通知,现在只是一个 png 图像。是否有可能做某事,以便我可以更改文本/数字,即..,03 以编程方式显示实际的通知数量。
谢谢
【问题讨论】:
看起来是图片,但会等待确认答案 【参考方案1】:这是一些对我有用的示例代码。
1:为您的徽章菜单项创建布局。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:layout_gravity="right" >
<!-- Menu Item Image -->
<ImageView
android:layout_
android:layout_
android:clickable="true"
android:src="@drawable/bkg_actionbar_notify_off" />
<!-- Badge Count -->
<TextView
android:id="@+id/actionbar_notifcation_textview"
android:layout_
android:layout_
android:layout_alignParentRight="true"
android:padding="@dimen/padding_small"
android:text="99"
android:textColor="@color/holo_orange_dark" />
</RelativeLayout>
2:在 res/menu 中创建一个菜单项并将 actionLayout 设置为您的布局
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/badge"
android:actionLayout="@layout/actionbar_badge_layout"
android:icon="@drawable/icn_menu_posts"
android:showAsAction="always">
</item>
</menu>
3:然后在您的活动或片段的 onCreateOptionsMenu 中,您可以执行类似的操作...
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
inflater.inflate(R.menu.badge, menu);
RelativeLayout badgeLayout = (RelativeLayout) menu.findItem(R.id.badge).getActionView();
TextView tv = (TextView) badgeLayout.findViewById(R.id.actionbar_notifcation_textview);
tv.setText("12");
注意:如果您想稍后更改徽章计数,您可以存储对传递给 onCreateOptionsMenu 的 Menu 对象的引用,并使用相同的代码来获取所需的视图并设置一个值。
=== ApCompat 警告 =========================================== ========
如果使用 AppCompatActivity 那么你必须在onCreateOptionsMenu
中设置actionView
@Override
public boolean onCreateOptionsMenu(Menu menu)
getMenuInflater().inflate(R.menu.main_menu, menu);
MenuItem item = menu.findItem(R.id.badge);
MenuItemCompat.setActionView(item, R.layout.actionbar_badge_layout);
RelativeLayout notifCount = (RelativeLayout) MenuItemCompat.getActionView(item);
TextView tv = (TextView) notifCount.findViewById(R.id.actionbar_notifcation_textview);
tv.setText("12");
return super.onCreateOptionsMenu(menu);
【讨论】:
感谢您的工作正常,但问题是 notification_menu 变得无法点击......我可能错在哪里? 您可以在一个向您传递菜单对象的活动中覆盖 onCreateOptions,然后调用 menu.getItem(i).getActionView().setOnClickListener 其中 i 是可见菜单项的索引,然后在您的 OnClickListener 中检查 v.getId() == R.id.badge (这是您的菜单项的 ID,而不是任何视图)... 我通过使用 ID 为 imagebuttonid 的 ImageButton 更改 actionbar_badge_layout 中的 ImageView 然后将 onClick 侦听器添加到该按钮来实现 onclick:MenuItemCompat.getActionView(menu.findItem(R.id.actionbar_badge_layout)).findViewById(R .id.imagebuttonid).setOnClickListener(new OnClickListener() @Override public void onClick(View v) System.out.println("clicked"); ); 嘿,我使用了你的技术,它奏效了,但我还想要多个动作图标,但一个 1 带有徽章..这里的问题是其他图标没有显示.. 你必须重定向点击事件: // 手动处理点击 item.getActionView().setOnClickListener(new View.OnClickListener() @Override public void onClick(View view) onOptionsItemSelected(item ); );【参考方案2】:一种选择是为此创建您自己的操作视图。在 XML 中使用 android:actionLayout
和在 Java 中使用 getActionView()
在膨胀后对其进行操作。您的操作视图将是ImageView
(用于图标)和...用于徽章的东西。我怀疑您会发现尝试通过文本制作该徽章会很困难,并且最好使用一堆徽章图像为您提供更好的服务,其中一个您可以叠加在图标之上(例如,通过RelativeLayout
或@ 987654326@,或者将图标包裹在LayerListDrawable
中)。
另一种选择是简单地拥有 N 个版本的图标+徽章,可能包含在 LevelListDrawable
中,您可以在运行时从中选择。
【讨论】:
但是 actionLayout 我在单击 MenuItem 后看到的内容。如何将其作为初始图标?现在默认它给出一个文本 NOTIFICATIONS @Archie.bpgc:“但是我点击 MenuItem 后看到的就是 actionLayout”——不,actionLayout
会立即使用,而不是“初始图标”。
但它最初显示 MenuItem 的标题,当点击时它只给出我设置的 actionLayout :(
@Archie.bpgc:如果你做得对,就不会。见github.com/commonsguy/cw-omnibus/tree/master/ActionBar/…
在您提供的代码中。为什么 icon 和 actionLayout 都设置为添加菜单项。 actionLayout 不应该是 icon 吗?【参考方案3】:
不得不对 domji84 的答案进行一些更改。由于某种原因,点击 imageview 并没有调用 click 事件,它在从 image view 中删除 clicklabe = "true" 后才起作用。
menu_item_cart.xml
<!-- Menu Item Image -->
<ImageView
android:layout_
android:layout_
android:src="@mipmap/ic_launcher" />
<!-- Badge Count -->
<TextView
android:id="@+id/cartCountTextView"
android:layout_
android:layout_
android:layout_alignParentRight="true"
android:padding="5dp"
android:layout_marginTop="5dp"
android:text="99"
android:textColor="@android:color/white"
android:textStyle="bold"/>
</RelativeLayout>
menu_main.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity">
<item
android:id="@+id/action_settings"
android:title="@string/action_settings"
android:orderInCategory="100"
app:showAsAction="never" />
<item
android:id="@+id/action_cart"
android:title="test"
app:actionLayout="@layout/menu_item_cart_count"
app:showAsAction="always">
</item>
</menu>
活动代码
@Override
public boolean onCreateOptionsMenu(Menu menu)
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
menu.findItem(R.id.action_cart).getActionView().setOnClickListener(this);
return true;
【讨论】:
menu.findItem(R.id.action_cart) 在此处返回 null 应用程序崩溃。【参考方案4】:在这里您可以使用自定义操作栏和默认操作栏... 首先通过xml或java准备布局。然后使用显示矩阵并获取窗口管理器。之后膨胀布局。像这样
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
ActionBar ab = getSupportActionBar();
View mactionbar = getLayoutInflater().inflate(R.layout.main2, null);
【讨论】:
以上是关于如何在 ActionBar 图标上获取文本?的主要内容,如果未能解决你的问题,请参考以下文章
Android:如何将ActionBar“主页”图标更改为应用程序图标以外的东西?