Custom Actionprovider ToolBar custom menu Little Red dot

Source: Internet
Author: User

Custom Actionprovider ToolBar custom menu Little Red dot

Copyright NOTICE: Reprint must indicate this article transferred from Zhangjie's blog: http://blog.csdn.net/yanzhenjie1003

Several goals for today:
1. Custom Actionprovider
2. Toolbar Actionbar custom Menu
3. Toolbar ActionBar Right Menu Add a corner label (Toolbar ActionBar menu add Little red dot)
The source code is at the end of the article.

Effect Preview

Customizing the menu does not affect any effects of the native Md. You can control properties such as text and colors displayed externally.

Requirements Description and Analysis

Usually we customize it to Titlebar achieve many custom effects. But then Toolbar it was really good to come out, so we all used it, Toolbar but what do we do to the right side of the Menu Button implementation similar to BadgeView this effect (such as the Little Red dot)?

The students who have not played after seeing this request ActionProvider may panic, but please follow me to analyze the composition of this Menu : a ImageView display icon, a TextView display number, and a TextView circular background (can be any shape or color). Then you can not use the system menu.xml this to do, so to customize the menu, someone might think of custom view,but do not need.

We usually write the menu when the Menu.xml is probably the following:

<?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_pic"  android:title  = "Zhangjie Blog"  app:showasaction  =/>  </< Span class= "Hljs-title" >menu ;   

In fact, this menu item has a android:actionProviderClass property, this property can be used to customize the content shown here (View), the value of this property is a complete class name, such as this com.yanzhenjie.XXOOProvider , and this XXOOProvider need to inherit ActionProvider , the specific operation is all in ActionProvider the Completed in.

First inherit ActionProvider

Here to sit down special instructions, because it Toolbar is support under the package, so we want to use the support following ActionProvider class, this class is support.v4 under, it is compatible Toolbar and ActionBar , so we customize this ActionProvider class can be in Toolbar and ActionBarused freely in the.

Because we want to achieve the angle mark, for the moment, the name of the class BadgeActionProvider , inheritance ActionProvider needs to implement the onCreateActionView() method:

publicclass BadgeActionProvider extends ActionProvider {    publicBadgeActionProvider(Context context) {        super(context);    }    @Override    publiconCreateActionView() {        return view;    }}
Custom layouts: Badgeview to display

We see the onCreateActionView() class needs return one View , this View is what we want to customize the view, so we then define the display View , very simple is the article at the beginning of the analysis of one ImageView and one TextView :

<?xml version= "1.0" encoding= "Utf-8"?><relativelayout xmlns:android="Http://schemas.android.com/apk/res/android" android:layout_width="Wrap_content"android:layout_height="Match_parent" android:background="Actionbaritembackground">                <ImageViewandroid:id= "@+id/iv_icon"android:layout_width="Wrap_ Content "android:layout_height=" Match_parent "android:layout_centerinparent=  "True"android:scaletype="center" />                                            <TextView        Android:id="@+id/tv_badge"        Android:layout_width="Wrap_content"        Android:layout_height="Wrap_content"        Android:layout_alignparentend="true"        Android:layout_alignparentright="true"        Android:layout_margin="2DP"        Android:background="@drawable/circle_red"        android:gravity="Center"        Android:text="0"        Android:textcolor="@android: Color/white"        android:textsize="12SP"/></relativelayout>

The above code must be interpreted only by referring to the android:background="?actionBarItemBackground" system default Toolbar / ActionBar the Menu click Effect. TextView android:background="@drawable/circle_red" is the red background of the circle.

Combination of Actionprovider and custom layouts

The above inheritance is also finished, the custom layout is also written, followed by the combination of the two:

 Public  class badgeactionprovider extends actionprovider {    PrivateImageView Mivicon;PrivateTextView Mtvbadge;//To record which view is clicked, so that the external can use a listener to accept multiple menu clicks.     Private intClickwhat;PrivateOnclicklistener Onclicklistener; Public Badgeactionprovider(Context context) {Super(context); }@Override     PublicViewOncreateactionview() {intSize = GetContext (). Getresources (). Getdimensionpixelsize (Android.support.design.r.dimen.abc_action_bar_default_        Height_material); Viewgroup.layoutparams Layoutparams =NewViewgroup.layoutparams (size, size); View view = Layoutinflater.from (GetContext ()). Inflate (R.layout.menu_badge_provider,NULL,false);        View.setlayoutparams (Layoutparams);        Mivicon = (ImageView) View.findviewbyid (R.id.iv_icon);        Mtvbadge = (TextView) View.findviewbyid (R.id.tv_badge); View.setonclicklistener (Onviewclicklistener);returnView }//Click to process.     PrivateView.onclicklistener Onviewclicklistener =NewView.onclicklistener () {@Override         Public void OnClick(View v) {if(Onclicklistener! =NULL) Onclicklistener.onclick (clickwhat); }    };//External settings monitoring.      Public void Setonclicklistener(intWhat, Onclicklistener Onclicklistener) { This. Clickwhat = what; This. Onclicklistener = Onclicklistener; } Public  interface onclicklistener {        voidOnClick (intwhat); }}

The above code is the only one with doubts:

int size = getContext().getResources().getDimensionPixelSize(        android.support.design.R.dimen.abc_action_bar_default_height_material);

This sentence is read support down Toolbar / ActionBar the height, in order to let the menu high and wide system to menu achieve consistency.

All right, the ActionProvider customization is basically over, add a few more custom methods:

//settings icon.  public  void   SetIcon  (@DrawableRes int  icon) {mivicon.setimageresource (icon);} //set the number displayed.  public  void   Setbadge  (int  i) {Mtvbadge.settext (integer.tostring (i));} //set the text.  public  void   Settextint  (@StringRes int  i) {mtvbadge.settext (i);} //set the displayed text.  public  void   SetText  (charsequence i) {mtvbadge.settext (i);} 
How to use a custom ActionProvider

Now it's time to go back to the beginning of the article, android:actionProviderClass fill in the full custom class name for the attribute, ActionProvider and say this is supprt the class, so here's a little bit of a change:

<?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_pic"        android:title="严振杰的博客"        app:actionProviderClass="com.yanzhenjie.BadgeActionProvider"        app:showAsAction="always" /></menu>

We have noticed that this has become the app:actionProviderClass result of the introduction of the XML Header xmlnamespace .

Java Code Control custom menu

The above Menu.xml preparation work is done, the next is to use Java code to load the XML into our Activity or Fragment in, here we take Activity for example, we inherit AppCompatActivity .

First, when loading the menu, record what we just customized ActionProvider :

private BadgeActionProvider mActionProvider;@OverridepublicbooleanonCreateOptionsMenu(Menu menu) {    getMenuInflater().inflate(R.menu.menu_main, menu);    MenuItem menuItem = menu.findItem(R.id.menu_delete);    mActionProvider = (BadgeActionProvider) MenuItemCompat.getActionProvider(menuItem);    mActionProvider.setOnClickListener(0, onClickListener);// 设置点击监听。    returntrue;}

Special note: A lot of classmates here Setonclicklistener when there is a null pointer exception, because the app:actionProviderClass="com.yanzhenjie.BadgeActionProvider" code refers to the custom class name error, you have to fill in your package name, do not copy the blog here.

Here set click to listen in the above also stressed, here is a pit to talk about, we just did not provide a few methods to set the icon and text, cannot be onCreateOptionsMenu() called directly, because Actionprovider has not loaded initialization completed , So if we initialize the icon and text dynamically, it needs to be in onWindowFocusChanged() :

@OverridepublicvoidonWindowFocusChanged(boolean hasFocus) {    super.onWindowFocusChanged(hasFocus);    mActionProvider.setIcon(R.mipmap.ic_action_delete_small);    mActionProvider.setIcon(R.mipmap.ic_action_picture);}

here also to illustrate, just onCreateOptionsMenu() can not be directly initialized, and so on after the onCreateOptionsMenu() execution of the method is free to call .

So now you can set the display of text and icons, then our article at the beginning of a number of targets are also completed, go to sleep, everyone goodnight.

This tutorial source code portal

Copyright statement: Reprint must indicate this article transferred from Zhangjie's blog: http://blog.csdn.net/yanzhenjie1003

Custom Actionprovider ToolBar custom menu Little Red dot

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.