web-dev-qa-db-fra.com

Disposition de notification personnalisée Android avec RemoteViews

J'essaie de créer une notification personnalisée pour mon application Android en utilisant cette post , et je suis tombé sur un problème que j'ai essayé de résoudre pendant les 2 dernières heures.

Seule la vue image de ma mise en page s'affiche, et je ne vois pas comment le faire fonctionner comme prévu.

Mon code:

package be.ac.ucl.lfsab1509.cumulus.services;

import Android.app.Notification;
import Android.app.PendingIntent;
import Android.content.Intent;
import Android.support.v4.app.NotificationCompat;
import Android.support.v4.app.TaskStackBuilder;
import Android.widget.RemoteViews;
import be.ac.ucl.lfsab1509.cumulus.R;
import be.ac.ucl.lfsab1509.cumulus.activities.MainActivity;
import be.ac.ucl.lfsab1509.cumulus.entities.Song;

public class CumulusNotification {

private CumulusService mCtx;
private CumulusMediaPlayer mPlayer;
private Notification mNotification;
private NotificationCompat.Builder mBuilder;
private RemoteViews mContentView;

public CumulusNotification(CumulusService ctx, CumulusMediaPlayer player){
    mCtx = ctx;
    mPlayer = player;

    mBuilder = new NotificationCompat.Builder(
            mCtx);
    mBuilder.setSmallIcon(R.drawable.ic_stat_cumulus_notification);
    //mBuilder.setContentTitle("Cumulus is playing");
    //mBuilder.setTicker("Cumulus");
    //mBuilder.setContentText(mCtx.getCurrentSong().title());

    Intent resultIntent = new Intent(mCtx, MainActivity.class);
    resultIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
            | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    resultIntent.setAction(Intent.ACTION_MAIN);
    TaskStackBuilder stackBuilder = TaskStackBuilder.create(mCtx);
    stackBuilder.addParentStack(MainActivity.class);
    stackBuilder.addNextIntent(resultIntent);
    PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0,
            PendingIntent.FLAG_UPDATE_CURRENT);
    mBuilder.setContentIntent(resultPendingIntent);

    mContentView = new RemoteViews(mCtx.getPackageName(), R.layout.statusbar);
    mContentView.setImageViewResource(R.id.notifimage, R.drawable.cumulus_icon);
    mContentView.setTextViewText(R.id.notiftitle, "Custom notification");
    mContentView.setTextViewText(R.id.notiftext, "This is a custom layout");
    mBuilder.setContent(mContentView);
}

public void startNotification() {
    mNotification = mBuilder.build();
    //mNotification.contentView = mContentView;
    mCtx.startForeground(R.integer.NOTIFICATION_ID, mNotification);
}

public void updateSong(Song song){
    mBuilder.setContentText(song.title());
    mNotification = mBuilder.build();
    mCtx.startForeground(R.integer.NOTIFICATION_ID, mNotification);
}
}

Le fichier XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/layout"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:padding="10dp"
Android:gravity="left" >
<ImageView Android:id="@+id/notifimage"
    Android:layout_width="wrap_content"
    Android:layout_height="fill_parent"
    Android:layout_alignParentLeft="true"
    Android:layout_marginRight="10dp" />
<TextView Android:id="@+id/notiftitle"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_toRightOf="@id/notifimage" />
<TextView Android:id="@+id/notiftext"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_toRightOf="@id/notifimage"
    Android:layout_below="@id/notiftitle" />
</RelativeLayout>

my notification

Merci pour l'aide

11
HappyRave

Le problème est que vous n'avez pas défini le contentView correct.

mBuilder.setContent(contentView);

Mais votre vue à distance est mContentView. changez le en

mBuilder.setContent(mContentView);

Voici un échantillon 

    NotificationCompat.Builder mBuilder =
        new NotificationCompat.Builder(this).setSmallIcon(R.drawable.ic_launcher);

    RemoteViews mContentView = new RemoteViews(getPackageName(), R.layout.test_tt);
    mContentView.setImageViewResource(R.id.image, R.drawable.ic_action_search);
    mContentView.setTextViewText(R.id.title, "Custom notification");
    mContentView.setTextViewText(R.id.text, "This is a custom layout");
    mBuilder.setContent(mContentView);

    startForeground(1001, mBuilder.build());
13
Libin

Vous pouvez voir un exemple de travail ici: http://www.laurivan.com/Android-notifications-with-custom-layout/

Je pense, en ajoutant 

// Set Icon
.setSmallIcon(R.drawable.smallimage)
// Set Ticker Message
.setTicker("Noification is created");

à votre constructeur peut résoudre le problème.

1
Artem Kleinschmidt

Je pense que c'est juste un problème de mise en page, plus j'y pense. Je pense que si vous définissiez Android:layout_alignParentRight="true" sur le TextViews, vous obtiendriez ce que vous recherchiez. Il semble que cela les place à droite de la variable ImageView, sans leur donner de largeur au moment de la mise en page, car ils n'en demandent pas et ils n'ont pas de contenu. 

Si cela ne fonctionne pas, faites le nous savoir!

0
Travis

Ce post explique très cool.

Fondamentalement et ainsi:

RemoteViews downloadViews = new RemoteViews(context.getPackageName(), R.layout.download_notification);
        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("Content Title")
                .setContentText("Content Text")
                .setContent(downloadViews)
                .setPriority(NotificationCompat.PRIORITY_MIN);
        final Notification notification = mBuilder.build();
        notification.bigContentView = downloadViews;

        NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        mNotificationManager.notify(1, notification);
0
Douglas Mesquita