需求描述與分析
在仿寫(xiě)知乎日?qǐng)?bào)APP的時(shí)候,需要給ToolBar
上的Menu Item
添加類(lèi)似BadgeView
的效果,如點(diǎn)贊圖標(biāo)旁邊的點(diǎn)贊數(shù)舌仍,效果如下圖:
知乎日?qǐng)?bào)效果
正準(zhǔn)備做的時(shí)候,發(fā)現(xiàn)沒(méi)做過(guò)從來(lái)沒(méi)做過(guò)這個(gè)功能,自己試了下也沒(méi)實(shí)現(xiàn)出來(lái)卓舵,然后就開(kāi)始了查找資料之旅,發(fā)現(xiàn)可以使用自定義
ActionProvider
來(lái)實(shí)現(xiàn)膀钠,如這篇博客:自定義ActionProvider ToolBar 自定義Menu小紅點(diǎn)掏湾。找著實(shí)現(xiàn)了一下,效果還不錯(cuò)托修,本著求知的精神又搜了下官方文檔忘巧,發(fā)現(xiàn)還可以通過(guò)MenuItem
的setActionView
方法來(lái)設(shè)置恒界,官方說(shuō)明如下:
Set an action view for this menu item. An action view will be displayed in place of an automatically generated menu item element in the UI when this item is shown as an action within a parent.
setActionView
方法有兩個(gè)睦刃,分別為setActionView (int resId)
和setActionView (View view)
。這里我用的是setActionView (int resId)
十酣。
代碼流程
廢話(huà)就不多說(shuō)了涩拙,上代碼:
首先需要寫(xiě)一個(gè)名為 action_item (名字隨意)的layout
文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:paddingLeft="8dp"
android:paddingRight="8dp">
<!--圖標(biāo)-->
<ImageView
android:id="@+id/action_item_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:ignore="ContentDescription"/>
<!--數(shù)量-->
<TextView
android:id="@+id/action_item_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="8dp"
android:paddingStart="8dp"
android:text="..."
android:textColor="@android:color/white"/>
</LinearLayout>
然后寫(xiě)一個(gè)menu
菜單文件际长,并在使用的Activity
中加載該菜單,并加載 action_item.xml 并設(shè)置想要顯示的內(nèi)容:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menu_share"
android:icon="@drawable/ic_share"
android:title="分享"
app:showAsAction="always"/>
<item
android:id="@+id/menu_collect"
android:icon="@drawable/ic_star"
android:title="收藏"
app:showAsAction="always"/>
<item
android:id="@+id/menu_comment"
android:icon="@drawable/ic_comment"
android:title="評(píng)論"
app:showAsAction="always"/>
<item
android:id="@+id/menu_like"
android:icon="@drawable/ic_thumb_up"
android:title="點(diǎn)贊"
app:showAsAction="always"/>
</menu>
public class MainActivity extends AppCompatActivity {
·····
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu, menu);
MenuItem comment = menu.findItem(R.id.menu_comment);
comment.setActionView(R.layout.action_item);
ImageView commentImg = (ImageView) comment.getActionView().findViewById(R.id.action_item_image);
TextView commentNum = (TextView) comment.getActionView().findViewById(R.id.action_item_text);
//設(shè)置顯示內(nèi)容
commentImg.setImageResource(R.drawable.ic_comment);
commentNum.setText("66");
MenuItem like = menu.findItem(R.id.menu_like);
like.setActionView(R.layout.action_item);
ImageView likeImg = (ImageView) like.getActionView().findViewById(R.id.action_item_image);
TextView likeNum = (TextView) like.getActionView().findViewById(R.id.action_item_text);
//設(shè)置顯示內(nèi)容
likeImg.setImageResource(R.drawable.ic_thumb_up);
likeNum.setText("100");
return super.onCreateOptionsMenu(menu);
}
}
完成效果:
初步效果
小問(wèn)題
設(shè)置單擊事件的時(shí)候不能直接在onOptionsItemSelected
方法中完成兴泥,必須要挨個(gè)設(shè)置單擊事件如單擊點(diǎn)贊:
like.getActionView().setOnClickListener();