简体   繁体   中英

Android custom notification layout with RemoteViews

I'm trying to create a custom notification for my android app using this post , and I stumbled upon a problem which I tried to resolve for the last 2 hours.

Only the imageview of my layout shows, and I can't figure out how to make it works like intended.

My 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);
}
}

The xml file:

<?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>

我的通知

Thanks for the help

Problem is you have not set the correct contentView.

mBuilder.setContent(contentView);

But your remote view is mContentView. change it to

mBuilder.setContent(mContentView);

Here is a sample

    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());

You can see working example here: http://www.laurivan.com/android-notifications-with-custom-layout/

I think, adding

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

to your builder can solve the problem.

I think this is just a layout issue, the more that I think about it. I think that if you were to set android:layout_alignParentRight="true" on the TextView s, you'd get what you were looking for. It looks like it's laying them out to the right of the ImageView , but not giving them any width at layout time, since they don't ask for any, and they don't have any content.

If that doesn't work, let us know!

This post explains very cool.

Basically and so:

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);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM