在状态栏中仅显示小图标而不显示通知

时间:2016-09-18 03:11:02

标签: android android-layout notifications

我想在status bar中不断显示小图标,而不会在系统的notification托盘上显示通知。

我尝试使用自定义layout并将根元素的可见性设置为View.GONEView.INVISIBLE,但对于两者,系统会忽略它。

我也尝试设置根元素的高度,但系统也忽略了它。

这是我的代码:

R.layout.custom_notification

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/custom_notification"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:background="@drawable/notif_background"
    android:orientation="horizontal"
    android:baselineAligned="false"/>

显示Notification的代码:

 NotificationManager nm = (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE);
 NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(ctx);
 mBuilder
         .setSmallIcon(drawableId)
         .setAutoCancel(false)
         .setOngoing(true)
         .setPriority(Notification.PRIORITY_MAX);
 Intent resultIntent = new Intent(ctx, SettingsActivity.class);
 PendingIntent resultPendingIntent = PendingIntent.getActivity(ctx, 0, resultIntent, 0);
 mBuilder.setContentIntent(resultPendingIntent);
 int layout =  R.layout.custom_notification ;
 RemoteViews contentView = new RemoteViews(ctx.getPackageName(), layout);
 contentView.setViewVisibility(R.id.custom_notification, View.INVISIBLE);
 mBuilder.setContent(contentView);
 nm.notify(NOTIFICATION_ID, mBuilder.build());

我很清楚,为了实现我的目标,我不需要记录解决方案。而且我也知道UX准则强烈建议不做这样的事情。所以没有必要把这个作为答案写给我。

5 个答案:

答案 0 :(得分:10)

根据开发人员文档显示图标而不显示任何相关通知,这不是一个好主意

状态栏通知需要以下所有内容:

  • 状态栏的图标(您感兴趣的)
  • 展开视图的标题和展开消息(除非您定义自定义展开视图)
  • PendingIntent,在点击通知以显示相关信息时被触发。

因此,如果您不想破坏用户体验,那么强烈建议您遵循用户体验指南,

逻辑上:状态栏有两部分 - 用户(通知)和系统(其他)。如果系统允许将某些东西放到系统部分 - 会有太多无用的图标(由其他应用程序发布),并且没有一致性,并且可能会破坏所有使用体验。

找到答案,为您提供访问警报here的默认状态栏图标的方法。根你的手机你可以做到这一点。在youtube上做一些技巧,同一主题的一些答案建议使用通知显示图标,但将通知文本设置为空,这样用户只能看到图标,但是再次&#39 ;不是一种方式

This is code对于系统中的状态栏实现,其中描述了左右图标(即系统图标),您可以从那里获得一些优势。描述它的答案是here

答案 1 :(得分:6)

我建议不要使用Google Play应用程序。 有几个原因:

  1. 如果您发现有助于显示隐形通知的错误,它似乎没什么。该错误仅适用于具有特定Android版本的部分设备。请记住:使用打开的API在大多数设备中正确执行常规代码非常困难。隐藏的API不适用于所有设备。

    1. 源代码中没有此类行为:http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/app/NotificationManager.java#NotificationManager.notify%28int%2Candroid.app.Notification%29。你无法找到这样的行为。

    2. 要预测行为,请使用Android的 * Compat 类。也就是说,仅用于通知NotificationCompat类!只有使用包装器才能帮助您的应用显示通知。

    3. 这是非常丑陋的UI / UX。

    4. 通知&#39;工作流程在很大程度上取决于Android版本。

答案 2 :(得分:1)

您可以使用InputMethodService.showStatusIcon()执行此操作。但我建议您显示正常通知,并向用户说明您的应用现在做了什么。

答案 3 :(得分:0)

您可以使用RemoteViews隐藏标题和文字

R.id.notification_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_alignParentLeft="true"
        android:layout_marginRight="10dp"
        android:layout_marginLeft="7dp"
        android:src="@drawable/icon_battery" />
</RelativeLayout>
MainActivity中的

RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.notification_layout);
Context application = getApplicationContext();

Intent resultIntent = new Intent(application, MainActivity.class);
resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent resultPendingIntent = PendingIntent.getActivity(application, 0, resultIntent, 0);
NotificationManager nmgr = (NotificationManager) application.getSystemService(Context.NOTIFICATION_SERVICE);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(application)
            .setSmallIcon(R.drawable.icon_battery);

mBuilder.setContent(contentView);
Notification mNotification = mBuilder.build();

//  mNotification.flags |= FLAG_NO_CLEAR;
nmgr.notify(0, mNotification);

答案 4 :(得分:0)

晚了,但可能对其他人有用。

就我而言,它是如此简单,只需在您的主要自定义布局中使用高度0dp

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/layout" android:layout_width="fill_parent" android:layout_height="0dp">

wrap_content在这里不起作用。