如何在 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/… 在您提供的代码中。为什么 iconactionLayout 都设置为添加菜单项。 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 图标上获取文本?的主要内容,如果未能解决你的问题,请参考以下文章

ActionBar上没有应用程序图标

如何在 ActionBar 中同时显示图标和动作标题?

Android:如何将ActionBar“主页”图标更改为应用程序图标以外的东西?

如何在android中添加actionbar white图标

如何在 ActionBar 的溢出菜单中显示图标

ActionBar 菜单项的动态可绘制图标? (安卓,ActionBarSherlock)