web-dev-qa-db-fra.com

Créer de grosses notifications personnalisées

Je voulais créer une notification comprenant certains contrôles. Étant donné que le texte et les contrôles sont petits avec une taille de notification par défaut (64dp), je voulais qu'il soit plus grand que la taille par défaut.
Il est possible de créer des notifications plus importantes, et je pense qu'il est également possible d'avoir une mise en page personnalisée, mais je ne sais pas comment.

Pour être plus précis, la capture d'écran suivante montre la notification de spotify (prise d'image de ici ): Spotify notification

Comme vous pouvez le voir, la taille est supérieure à celle par défaut. De plus, il a une sorte de boutons Image sans texte - si vous utilisez Notification.Builder.addAction () , vous pouvez fournir une icône mais aussi besoin de fournir une CharSequence comme description - si vous laissez la description vide, il y aura toujours de l'espace réservé pour le texte et si vous passez null , il va planter.

Quelqu'un peut-il me dire comment créer une grosse notification avec une mise en page personnalisée?

Merci

19
MalaKa

Mise à jour en raison de modifications de l'API:

À partir de l'API 24, le Notification.Builder Contient une méthode setCustomBigContentView (RemoteViews) -. Le NotificationCompat.Builder (qui fait partie du package support.v4) contient également cette méthode.
Veuillez noter que la documentation de NotificationCompat.Builder.setCustomBigContentView indique:

Fournissez des RemoteViews personnalisés à utiliser à la place du modèle de plateforme dans le formulaire développé. Cela remplacera la disposition développée qui serait autrement construite par cet objet Builder. Aucune opération sur les versions antérieures à JELLY_BEAN.

Par conséquent, cela ne fonctionnera également que pour l'API> = 16 (JELLY_BEAN).


Réponse originale

Donc, après une utilisation excessive de Google, j'ai trouvé ce tutoriel expliquant comment utiliser les grandes dispositions personnalisées. L'astuce n'est pas d'utiliser setStyle() mais de définir manuellement le champ bigContentView du Notification après l'avoir construit . Cela semble un peu hacky, mais voici ce que j'ai finalement trouvé:

notification_layout_big.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="100dp" <!-- This is where I manually define the height -->
    Android:orientation="horizontal" >

    <!-- some more elements.. --> 
</LinearLayout>

Construire Notification dans le code:

Notification foregroundNote;

RemoteViews bigView = new RemoteViews(getApplicationContext().getPackageName(),
    R.layout.notification_layout_big);

// bigView.setOnClickPendingIntent() etc..

Notification.Builder mNotifyBuilder = new Notification.Builder(this);
foregroundNote = mNotifyBuilder.setContentTitle("some string")
        .setContentText("Slide down on note to expand")
        .setSmallIcon(R.drawable.ic_stat_notify_white)
        .setLargeIcon(bigIcon)
        .build();

foregroundNote.bigContentView = bigView;

// now show notification..
NotificationManager mNotifyManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotifyManager.notify(1, foregroundNote);

Modifier
Comme indiqué par chx101, cela ne fonctionne que pour API> = 16. Je ne l'ai pas mentionné dans cette réponse, mais il a été mentionné dans le tutoriel lié ci-dessus:

Les notifications étendues ont été introduites pour la première fois dans Android 4.1 JellyBean [API 16].

58
MalaKa