fragment + toolbar 使用及 toorbar 添加Badge 红点显示

我的app需要用到 viewpager+fragment + toolbar,其中toolbar 需要添加消息显示未独数量,所以用到了 自定义

ActionProvider

先说下 frament 怎么使用 toolbar 

1.在fragment的oncreate方法中设置:

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
    }

2.在onViewCreated方法中初始化toolbar:

 @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        ButterKnife.bind(this, view);
        LogUtils.e(TAG, "onCreateView");
        initToolBar();

    }

private void initToolBar() {
        toolbar.inflateMenu(R.menu.main);
//这里不要这么用,不然每次切换viewpager就会重新执行 onCreateOptionsMenu 方法,会刷新menu显示,我的因为需要刷新 消息的未读个数,直接用上面的toolbar.inflateMenu(R.menu.main);就可以了,显示点击都没问题
//        ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
//        ((AppCompatActivity) getActivity()).getSupportActionBar().setDisplayShowTitleEnabled(false);

        toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                int id = item.getItemId();
                switch (id) {
                    case R.id.ab_search:
                        startActivity(SearchActivity.class, -1);
                        break;
                    case R.id.action_share:
//                        startActivity(MessageActivity.class,-1);

                        break;
//                    case R.id.action_settings:
//                        break;
                    default:
                }
                return true;
            }
        });
        //因为自定义的BadgeActionProvider 需要设置未读消息个数,所以我延迟了1秒显示
        handler.sendEmptyMessageDelayed(1,1000);

    }

3.在重写onCreateOptionsMenu:

 @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        menu.clear();//这句话没用啊,谁知道
        inflater.inflate(R.menu.main, menu);
        super.onCreateOptionsMenu(menu, inflater);//这句话写在上面和下面都一样
    }

这完成了一个fragment的toolbar

当你发现你的toolbar切换fragment的时候显示错乱就检查下这里:

//这里不要这么用,不然每次切换viewpager就会重新执行 onCreateOptionsMenu 方法,会刷新menu显示,我的因为需要刷新 消息的未读个数,直接用上面的toolbar.inflateMenu(R.menu.main);就可以了,显示点击都没问题
//        ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
//        ((AppCompatActivity) getActivity()).getSupportActionBar().setDisplayShowTitleEnabled(false);

关于小红点如图所示需要自定义 

 贴下代码

R.menu.main

<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="com.portrait.activity.MainActivity" >

    <item
        android:id="@+id/ab_search"
        android:orderInCategory="80"
        android:title="搜索"
        android:iconTintMode="src_in"
        android:icon="@drawable/icon_ss_white"
        app:showAsAction="always"
        />
    <item
        android:id="@+id/action_share"
        android:orderInCategory="90"
        app:showAsAction="always"
        android:title=""
        app:actionProviderClass="com.***.BadgeActionProvider" />


</menu>

 这个也是网上找的链接1 和链接2

public class BadgeActionProvider extends ActionProvider {

    private ImageView mIvIcon;
    private TextView mTvBadge;

    private View.OnClickListener mOnClickListener;

    public BadgeActionProvider(Context context) {
        super(context);
    }

    @Override
    public View onCreateActionView() {
        //读取support下Toolbar/ActionBar的高度,为了让这个Menu高和宽和系统的menu达到一致。
        int size = (int) getContext().getResources().getDimension
                (androidx.appcompat.R.dimen.abc_action_bar_default_height_material);
        ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(size, size);
        View view = LayoutInflater.from(getContext())
                .inflate(R.layout.menu_badge_provider, null, false);
        view.setLayoutParams(params);
        mIvIcon = view.findViewById(R.id.iv_icon);
        mTvBadge = view.findViewById(R.id.tv_badge);
        view.setOnClickListener(new BadgeMenuClickListener());
        return view;
    }

    /**
     * 设置图标。
     *
     * @param icon drawable 或者mipmap中的id。
     */
    public void setIcon(@DrawableRes int icon) {
        mIvIcon.setImageResource(icon);
    }

    /**
     * 设置显示的数字。
     *
     * @param i 数字。
     */
    public void setBadge(int i) {
        if (i<=0){
            mTvBadge.setVisibility(View.INVISIBLE);
        }else {
            mTvBadge.setVisibility(View.VISIBLE);
        }
        mTvBadge.setText(Integer.toString(i));
    }

    /**
     * 设置文字。
     *
     * @param i string.xml中的id。
     */
    public void setTextInt(@StringRes int i) {
        mTvBadge.setText(i);
    }

    /**
     * 设置显示的文字。
     *
     * @param i 文字。
     */
    public void setText(CharSequence i) {
        mTvBadge.setText(i);
    }

    public void setOnClickListener(View.OnClickListener onClickListener) {
        mOnClickListener = onClickListener;
    }

    private class BadgeMenuClickListener implements View.OnClickListener {

        @Override
        public void onClick(View v) {
            if (mOnClickListener != null) {
                mOnClickListener.onClick(v);
            }
        }
    }
}

 

使用的时候需要注意一点就行 我们刚才不是提供了几个方法设置icon和text吗,不能在onCreateOptionsMenu()直接调用,因为ActionProvider还没有加载初始化完成。

只是在onCreateOptionsMenu()不能直接初始化,等onCreateOptionsMenu()方法执行完了就可以随意调用了

补充:onCreateOptionsMenu()不重写也是可以的,而且这样效果比较好

直接用toolbar.inflateMenu(R.menu.main);这样写然后点击事件或者控件都可以这么用

MenuItem menuItem = toolbar.getMenu().findItem(R.id.action_share);
mBadgeActionProvider = (BadgeActionProvider) MenuItemCompat.getActionProvider(menuItem);
mBadgeActionProvider.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(MessageActivity.class,-1);
            }
        });
        toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                int id = item.getItemId();
                switch (id) {
                    case R.id.ab_search:
                        break;
                    case R.id.action_share:

                        break;
                    default:
                }
                return true;
            }
        });
        mBadgeActionProvider.setBadge(1);

 

 

发布了15 篇原创文章 · 获赞 5 · 访问量 3398
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览