<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Android實(shí)現(xiàn)導(dǎo)航欄添加消息數(shù)目提示功能

          共 12992字,需瀏覽 26分鐘

           ·

          2021-09-01 12:09

          效果圖:


          寫一篇短小精悍,好用的知識(shí)積累吧。開發(fā)中時(shí)常會(huì)出現(xiàn)信息提醒,新內(nèi)容提示等等一堆問題。其實(shí)就是在各種控件或者是item上面加“小圓點(diǎn)”。網(wǎng)上一搜一大堆。。。但是感覺說的好多。我們只需要基本功能2333.

          下面介紹三種方式吧,但是大體套路相同。


          一、解需求思路

          在 RadioGroup 的 RadioButton 上面直接加小圓點(diǎn),對(duì)于我來說實(shí)現(xiàn)有點(diǎn)困難,因?yàn)槲蚁旅孢€有文字。搞不好,文字就擠沒了。所有我現(xiàn)在在原有的 RadioGroup 上面加一層覆蓋物,類似于 ui 常常接觸的圖層。


          二、具體實(shí)現(xiàn)方式

          1、布局

          就是在原有的 RadioGroup 上覆蓋一層透明的 button 并且保證位置相同相同
          <?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:background="@color/colorGrayBg"    tools:context="cn.ln80.happybirdcloud119.activity.MainActivity">
          <android.support.v4.view.ViewPager android:id="@+id/vp_main_page" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="61dp" />
          <!--底欄--> <RadioGroup android:id="@+id/rg_main_bottom" android:layout_width="match_parent" android:layout_height="@dimen/iconsize_60" android:layout_alignParentBottom="true" android:background="@android:color/white" android:orientation="horizontal">

          <RadioButton android:id="@+id/rb_main_task" style="@style/BottomRadio" android:drawableTop="@drawable/bg_bottom_task" android:text="可視化" android:textColor="@drawable/txt_bottom_notify" />

          <RadioButton android:id="@+id/rb_main_notify" style="@style/BottomRadio" android:layout_height="match_parent" android:drawableTop="@drawable/bg_bottom_notify" android:text="通知" android:textColor="@drawable/txt_bottom_notify" />

          <RadioButton android:id="@+id/rb_main_home" style="@style/BottomRadio" android:layout_marginTop="@dimen/widget_margin_5" android:checked="true" android:drawableTop="@drawable/bg_bottom_home" android:text="主頁(yè)" android:textColor="@drawable/txt_bottom_notify" />
          <RadioButton android:id="@+id/rb_main_inspect" style="@style/BottomRadio" android:drawableTop="@drawable/bg_bottom_inspect" android:text="巡檢" android:textColor="@drawable/txt_bottom_notify" />
          <RadioButton android:id="@+id/rb_main_mine" style="@style/BottomRadio" android:drawableTop="@drawable/bg_bottom_mine" android:text="我的" android:textColor="@drawable/txt_bottom_notify" />
          </RadioGroup>
          <LinearLayout android:layout_width="match_parent" android:layout_height="@dimen/iconsize_60" android:layout_alignParentBottom="true" android:orientation="horizontal">
          <Button android:id="@+id/btn_main_task" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:background="@null" />
          <Button android:id="@+id/btn_main_notification" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:background="@null" />
          <Button android:id="@+id/btn_main_home" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:background="@null" />
          <Button android:id="@+id/btn_main_inspect" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:background="@null" />
          <Button android:id="@+id/btn_main_my" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:background="@null" /> </LinearLayout></RelativeLayout>


          2、Activity 內(nèi)使用代碼

          有網(wǎng)友問我如何實(shí)現(xiàn)的覆蓋 LinearLayout 之后的點(diǎn)擊事件傳遞問題,
          我補(bǔ)充一下:

          由于 RadioGroup 內(nèi)的 RadioButton 是均分的, LinearLayout 內(nèi)的 Button 也是均分的,所以 直接在button 的 onClick()方法內(nèi)進(jìn)行點(diǎn)擊事件的傳遞就好了。

          代碼大概是下面這個(gè)樣子。
              @OnClick({R.id.btn_main_task, R.id.btn_main_notification, R.id.btn_main_home, R.id.btn_main_inspect, R.id.btn_main_my})    public void onViewClicked(View view) {        switch (view.getId()) {            case R.id.btn_main_task:                rbTask.setChecked(true);                break;            case R.id.btn_main_notification:                rbNotify.setChecked(true);                break;            case R.id.btn_main_home:                rbHome.setChecked(true);                break;            case R.id.btn_main_inspect:                rbInspect.setChecked(true);                break;            case R.id.btn_main_my:                rbMine.setChecked(true);                break;        }    }


          三、第一種方式

          public class BadgeView extends android.support.v7.widget.AppCompatTextView {
          private boolean mHideOnNull = true;
          public BadgeView(Context context) { this(context, null); }
          public BadgeView(Context context, AttributeSet attrs) { this(context, attrs, android.R.attr.textViewStyle); }
          public BadgeView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle);
          init(); }
          private void init() { if (!(getLayoutParams() instanceof LinearLayout.LayoutParams)) { LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( android.view.ViewGroup.LayoutParams.WRAP_CONTENT, android.view.ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.END | Gravity.TOP); setLayoutParams(layoutParams); }
          // set default font setTextColor(Color.WHITE); setTypeface(Typeface.DEFAULT_BOLD); setTextSize(TypedValue.COMPLEX_UNIT_SP, 11); setPadding(dip2Px(5), dip2Px(1), dip2Px(5), dip2Px(1));
          // set default background setBackground(9, Color.parseColor("#d3321b"));
          setGravity(Gravity.CENTER);
          // default values setHideOnNull(true); setBadgeCount(0); }
          public void setBackground(int dipRadius, int badgeColor) { int radius = dip2Px(dipRadius); float[] radiusArray = new float[]{radius, radius, radius, radius, radius, radius, radius, radius};
          RoundRectShape roundRect = new RoundRectShape(radiusArray, null, null); ShapeDrawable bgDrawable = new ShapeDrawable(roundRect); bgDrawable.getPaint().setColor(badgeColor); setBackground(bgDrawable); }
          /** * @return Returns true if view is hidden on badge value 0 or null; */ public boolean isHideOnNull() { return mHideOnNull; }
          /** * @param hideOnNull the hideOnNull to set */ public void setHideOnNull(boolean hideOnNull) { mHideOnNull = hideOnNull; setText(getText()); }
          /* * (non-Javadoc) * * @see android.widget.TextView#setText(java.lang.CharSequence, android.widget.TextView.BufferType) */ @Override public void setText(CharSequence text, BufferType type) { if (isHideOnNull() && (text == null || text.toString().equalsIgnoreCase("0"))) { setVisibility(View.GONE); } else { setVisibility(View.VISIBLE); } super.setText(text, type); }
          public void setBadgeCount(int count) { setText(String.valueOf(count)); }
          public Integer getBadgeCount() { if (getText() == null) { return null; }
          String text = getText().toString(); try { return Integer.parseInt(text); } catch (NumberFormatException e) { return null; } }
          public void setBadgeGravity(int gravity) { FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) getLayoutParams(); params.gravity = gravity; setLayoutParams(params); }
          public int getBadgeGravity() { FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) getLayoutParams(); return params.gravity; }
          public void setBadgeMargin(int dipMargin) { setBadgeMargin(dipMargin, dipMargin, dipMargin, dipMargin); }
          public void setBadgeMargin(int leftDipMargin, int topDipMargin, int rightDipMargin, int bottomDipMargin) { FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) getLayoutParams(); params.leftMargin = dip2Px(leftDipMargin); params.topMargin = dip2Px(topDipMargin); params.rightMargin = dip2Px(rightDipMargin); params.bottomMargin = dip2Px(bottomDipMargin); setLayoutParams(params); }
          public int[] getBadgeMargin() { FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) getLayoutParams(); return new int[]{params.leftMargin, params.topMargin, params.rightMargin, params.bottomMargin}; }
          public void incrementBadgeCount(int increment) { Integer count = getBadgeCount(); if (count == null) { setBadgeCount(increment); } else { setBadgeCount(increment + count); } }
          public void decrementBadgeCount(int decrement) { incrementBadgeCount(-decrement); }
          /* * Attach the BadgeView to the TabWidget * * @param target the TabWidget to attach the BadgeView * * @param tabIndex index of the tab */ public void setTargetView(TabWidget target, int tabIndex) { View tabView = target.getChildTabViewAt(tabIndex); setTargetView(tabView); }
          /* * Attach the BadgeView to the target view * * @param target the view to attach the BadgeView */ public void setTargetView(View target) { if (getParent() != null) { ((ViewGroup) getParent()).removeView(this); }
          if (target == null) { return; }
          if (target.getParent() instanceof FrameLayout) { ((FrameLayout) target.getParent()).addView(this);
          } else if (target.getParent() instanceof ViewGroup) { ViewGroup parentContainer = (ViewGroup) target.getParent(); int groupIndex = parentContainer.indexOfChild(target); parentContainer.removeView(target);
          FrameLayout badgeContainer = new FrameLayout(getContext()); ViewGroup.LayoutParams parentLayoutParams = target.getLayoutParams();
          badgeContainer.setLayoutParams(parentLayoutParams); target.setLayoutParams(new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
          parentContainer.addView(badgeContainer, groupIndex, parentLayoutParams); badgeContainer.addView(target);
          badgeContainer.addView(this); } else if (target.getParent() == null) { Log.e(getClass().getSimpleName(), "ParentView is needed"); }
          }
          /* * converts dip to px */ private int dip2Px(float dip) { return (int) (dip * getContext().getResources().getDisplayMetrics().density + 0.5f); }}


          將這個(gè)代碼直接 C、V 到自己的 類內(nèi),然后在使用的地方直接填寫如下代碼:
             BadgeView badgeView = new BadgeView(this);   badgeView.setTargetView(btnMainNotification);   badgeView.setBadgeCount(12);   badgeView.setBackground(20, getResources().getColor(R.color.colorRed));


          這個(gè)自定義的代碼是一位外國(guó)大佬搞出來的,原版代碼在這,


          歡迎查閱:

          BadgeView(https://github.com/stefanjauker/BadgeView)


          這里面的一些屬性:

              //設(shè)置依附的控件    setTargetView(View)     //設(shè)置顯示的數(shù)字    setBadgeCount(int)     //設(shè)置顯示的位置    setBadgeGravity(Gravity)     //設(shè)置背景色    setBackgroundColor()      //設(shè)置背景圖片    setBackgroundResource()     //設(shè)置顯示字體  比如說加粗、傾斜、啥的    setTypeface()     //設(shè)置字體陰影    setShadowLayer()


          四、第二種方式

          引用這位大佬的依賴 :
          BadgeView(https://github.com/qstumn/BadgeView)


           ---> compile 'q.rorbin:badgeview:1.1.3'


          代碼中使用:
          new QBadgeView(this).bindTarget(btnMainNotification).setBadgeText("99+").setBadgeBackgroundColor(getResources().getColor(R.color.colorRed));


          可以返回一個(gè) Badge 對(duì)象提高開發(fā)者操作。

          一些常用屬性
                    //設(shè)置Badge數(shù)字    setBadgeNumber(int i);          //設(shè)置Badge文本    setBadgeText(String text);            //設(shè)置文本字體大小    setBadgeTextSize(int size);           // 設(shè)置文本顏色    setBadgeTextColor();          //設(shè)置是否顯示精確模式數(shù)值     setExactMode();          //設(shè)置Badge相對(duì)于TargetView的位置     setBadgeGravity();           //設(shè)置外邊距     setGravityOffset();          //設(shè)置內(nèi)邊距     setBadgePadding();          //設(shè)置背景色     setBadgeBackgroundColor();           //設(shè)置背景圖片      setBadgeBackground();          //設(shè)置是否顯示陰影      setShowShadow();          //打開拖拽消除模式并設(shè)置監(jiān)聽      setOnDragStateChangedListener();          //描邊      stroke();          //隱藏Badge      hide();


          五、最后一種實(shí)現(xiàn)方式

          可以參考一下Github地址:
          https://github.com/bingoogolapple/BGABadgeView-Android


          六、總結(jié)

          總體的實(shí)現(xiàn)思路就是,在底部導(dǎo)航欄覆蓋一層透明的布局,然后在透明布局內(nèi)的控件上面依賴上小圓點(diǎn)。


          到這里就結(jié)束啦。
          瀏覽 45
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  中文字幕精品久久久 | 网友自拍超碰 | 亚洲国产黄色电影 | 欧美亚州视频 | 欧美成人无码A片免费一区澳门 |