新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Android無布局文件下自定義通知欄notification的 icon

        Android無布局文件下自定義通知欄notification的 icon

        作者: 時間:2018-08-31 來源:網絡 收藏

        在開發項目一個與通知欄有關的功能時,由于自己的項目是基于插件形式的所以無法引入系統可用的布局文件,這樣無法自定義布局,造成無法自定義通知欄的icon。

        本文引用地址:http://www.104case.com/article/201808/388191.htm

        在網上也有一種不用布局文件更換icon的方法,但是由于Android的開放性,某些手機廠商會修改通知的源碼,不是使用系統原有的布局文件方法有一定的局限性。文章如下http://blog.csdn.net/z1074971432/article/details/10446715有興趣的朋友可以看下。

        為了適配大多數的機型這里衍生出一種比較曲線救國的方式。。。

        public void show(String title, CharSequence content, Bitmap bitmap, PendingIntent intent)

        {

        // 在2.3的機子上,如果id相同的notifation,有一個帶ContentIntent一個不帶就會拋異常

        _notification.setLatestEventInfo(_context, , , null);

        _notification.flags = _flag;

        RemoteViews hide = _notification.contentView;

        initView(_notification,hide, title, content, intent,bitmap);

        _manager.notify(_id, _notification);

        }

        public void cancel()

        {

        _manager.cancel(_id);

        }

        @SuppressWarnings(deprecation)

        void initView(final Notification bar, final RemoteViews views, String title, CharSequence text, PendingIntent intent, final Bitmap bitmap)

        {

        bar.contentView = null;

        bar.setLatestEventInfo(_context, title, text, intent);

        Notification notification = new Notification();

        notification.setLatestEventInfo(_context, , , null);

        View view = notification.contentView.apply(_context, null);//以notification實例化一個View,這個就是系統當前使用的布局視圖

        ViewGroup group = (ViewGroup) view;

        findView(group, new ViewVisitor()

        {

        @Override

        public void onFindView(View item)

        {

        if (item instanceof ImageView)//查找這個布局下的ImageView就是icon控件

        {

        bar.contentView.setInt(item.getId(), setAlpha, 0);//將原有的icon隱藏,由于在小米系統中系統設置的icon會覆蓋原有設置的

        views.setViewPadding(item.getId(), item.getPaddingLeft(), item.getPaddingTop(), item.getPaddingRight(), item.getPaddingBottom());

        if (bitmap != null)

        views.setImageViewBitmap(item.getId(), bitmap);//設置icon圖片

        else views.setImageViewResource(item.getId(), _context.getApplicationInfo().icon);

        }

        else if(item instanceof TextView)

        {

        views.setViewVisibility(item.getId(), View.GONE);//隱藏最上層的view里的所有的TextView,不與底層的重疊

        }

        }

        });

        views.setInt(view.getId(), setBackgroundColor, Color.argb(0, 0, 0, 0));設置上層布局的背景透明

        views.setViewPadding(view.getId(), 0, view.getPaddingTop(), view.getPaddingRight(), view.getPaddingBottom());

        bar.contentView.addView(view.getId(), views);//將views添加到原有的布局視圖上

        }

        public interface ViewVisitor

        {

        void onFindView(View view);

        }

        void findView(ViewGroup group, ViewVisitor visitor)//查找視圖里面的所有子視圖

        {

        for (int i = 0; i group.getChildCount(); i++)

        {

        View view = group.getChildAt(i);

        if (visitor != null)

        visitor.onFindView(view);

        if (view instanceof ViewGroup)

        findView((ViewGroup) view, visitor);

        }

        }

        由于無法對自定義的布局進行準確定位,所以這種方式的icon和布局大小與原有系統樣式可能有一點偏差!



        關鍵詞:

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 乡宁县| 西乌| 潮州市| 吉木萨尔县| 铜山县| 牟定县| 上饶市| 卫辉市| 石屏县| 宜君县| 浑源县| 龙海市| 上饶市| 卫辉市| 绵阳市| 鄂州市| 永丰县| 芦溪县| 万安县| 黔南| 永善县| 资溪县| 特克斯县| 永登县| 奉化市| 楚雄市| 弋阳县| 大厂| 光泽县| 长宁县| 洛浦县| 南平市| 天全县| 临西县| 资溪县| 灵宝市| 平舆县| 商水县| 庆云县| 将乐县| 开化县|