web-dev-qa-db-fra.com

Modifier la disposition des notifications

J'ai décompilé mon application de musique système (de Sony Ericsson pour Android GB 2.3.7) parce que je veux changer la disposition des notifications. J'ai trouvé la méthode qui crée la notification avec ce code:

private void sendStatusBarNotification(Track paramTrack)
{
    if (paramTrack != null)
    {
        NotificationManager localNotificationManager = (NotificationManager)this.mContext.getSystemService("notification");
        String str = paramTrack.getArtist();

        if ((str == null) || (str.equals(this.mContext.getString(2131361954))))
            str = this.mContext.getString(2131361798);

        Notification localNotification = new Notification(2130837696, paramTrack.getTitle() + " - " + str, System.currentTimeMillis());
        localNotification.flags = (0x2 | localNotification.flags);
        localNotification.flags = (0x20 | localNotification.flags);

        PendingIntent localPendingIntent = PendingIntent.getActivity(this.mContext, 0, new Intent(this.mContext, MusicActivity.class), 268435456);
        localNotification.setLatestEventInfo(this.mContext, paramTrack.getTitle(), str, localPendingIntent);
        localNotificationManager.notify(0, localNotification);
    }
}

Ma question est maintenant: comment puis-je changer la disposition des notifications? Je souhaite créer une mise en page qui ressemble à la mise en page de notification d'origine Android mais avec une image supplémentaire à droite de la notification. Comment faire?

32
Cilenco

Créez d'abord un xml pour votre notification.

custom_notification.xml:

<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" >
    <ImageView Android:id="@+id/image"
        Android:layout_width="wrap_content"
        Android:layout_height="fill_parent"
        Android:layout_alignParentLeft="true"
        Android:layout_marginRight="10dp" />
    <TextView Android:id="@+id/title"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_toRightOf="@id/image"
        style="Custom Notification Title" />
    <TextView Android:id="@+id/text"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_toRightOf="@id/image"
        Android:layout_below="@id/title"
        style="Custom Notification Text" />
</RelativeLayout>

Maintenant, le Java:

public class MainActivity extends Activity {

    @SuppressWarnings("deprecation")
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        int icon = R.drawable.ic_launcher;
        long when = System.currentTimeMillis();
        Notification notification = new Notification(icon, "Custom Notification", when);

        NotificationManager mNotificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);

        RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.custom_notification);
        contentView.setImageViewResource(R.id.image, R.drawable.ic_launcher);
        contentView.setTextViewText(R.id.title, "Custom notification");
        contentView.setTextViewText(R.id.text, "This is a custom layout");
        notification.contentView = contentView;

        Intent notificationIntent = new Intent(this, MainActivity.class);
        PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
        notification.contentIntent = contentIntent;

        notification.flags |= Notification.FLAG_NO_CLEAR; //Do not clear the notification
        notification.defaults |= Notification.DEFAULT_LIGHTS; // LED
        notification.defaults |= Notification.DEFAULT_VIBRATE; //Vibration
        notification.defaults |= Notification.DEFAULT_SOUND; // Sound

        mNotificationManager.notify(1, notification);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}

J'espère que cette chose fonctionne pour vous.

Edit: Vous pouvez également visiter si vous rencontrez un problème comme this .

Vous pouvez également visiter ici pour plus d'informations.

Modifier le 26 avril 2016 Vous pouvez utiliser NotificationCompat.Builder pour créer l'instance Notification comme ci-dessous:

NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
            .setSmallIcon(icon)
            .setContent(contentView)
            .setContentTitle("Custom Notification")
            .setWhen(when);
...
mNotificationManager.notify(1, notificationBuilder.build());
81
Chintan Soni

Ici, j'ai joint des captures d'écran, le premier écran contient un titre du message et lorsque nous cliquons sur la flèche vers le bas à droite du nom de l'application, cela conduit à la deuxième capture d'écran qui est une mise en page personnalisée pour la notification Push. que j'ai conçu pour le mien.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_margin="4dp"
xmlns:card_view="http://schemas.Android.com/apk/res-auto"
Android:orientation="vertical"
card_view:cardCornerRadius="5dp"
card_view:cardUseCompatPadding="true">

<LinearLayout
    Android:layout_width="match_parent"
    Android:orientation="horizontal"
    Android:background="#80000000"
    Android:layout_height="wrap_content">

    <ImageView
        Android:src="@mipmap/ic_launcher"
        Android:layout_width="50dp"
        Android:layout_height="match_parent"
        Android:padding="10dp"
        Android:layout_marginLeft="5dp"
        Android:background="@null"
        Android:layout_gravity="center_vertical|center_horizontal"
        Android:scaleType="centerCrop"/>
    <TextView
        Android:id="@+id/title"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_gravity="bottom"
        Android:minHeight="48dp"
        Android:paddingBottom="16dp"
        Android:paddingLeft="16dp"
        Android:paddingRight="16dp"
        Android:paddingTop="16dp"
        Android:background="@Android:color/transparent"
        Android:textColor="@Android:color/white"
        tools:text="Test"/>
</LinearLayout>
<ImageView
    Android:id="@+id/image"
    Android:layout_width="match_parent"
    Android:layout_height="fill_parent"
    Android:adjustViewBounds="true"
    Android:contentDescription="@null"
    Android:scaleType="centerCrop"
    Android:src="@drawable/placeholder"/>
</LinearLayout>

Méthode pour créer une notification avec une disposition personnalisée,

public static void createNotification(String title, String body,String image_url, Context context, int notificationsId, String single_id) {
    Intent notificationIntent;

    long when = System.currentTimeMillis();
    int id = (int) System.currentTimeMillis();

    Bitmap bitmap = getBitmapFromURL(image_url);
    NotificationCompat.BigPictureStyle notifystyle = new NotificationCompat.BigPictureStyle();
    notifystyle.bigPicture(bitmap);
    RemoteViews contentView = new RemoteViews(context.getPackageName(), R.layout.custom_notification_layout);
    contentView.setImageViewBitmap(R.id.image, bitmap);
    contentView.setTextViewText(R.id.title, body);

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context)
            .setSmallIcon(R.drawable.ic_launcher)
            .setStyle(notifystyle)
            .setCustomBigContentView(contentView)
            .setContentText(body);
    NotificationManager mNotificationManager = (NotificationManager) context
            .getSystemService(Context.NOTIFICATION_SERVICE);

    notificationIntent = new Intent(context, SinglePost.class);
    notificationIntent.putExtra("single_id",single_id);
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
    PendingIntent contentIntent = PendingIntent.getActivity(context, id, notificationIntent, 0); 

    Notification notification = mBuilder.build();
    notification.contentIntent = contentIntent;
    notification.flags |= Notification.FLAG_AUTO_CANCEL;
    notification.defaults |= Notification.DEFAULT_SOUND;
    notification.defaults |= Notification.DEFAULT_VIBRATE;


    mNotificationManager.notify(notificationsId, notification);

}

public static Bitmap getBitmapFromURL(String strURL) {
    try {
        URL url = new URL(strURL);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoInput(true);
        connection.connect();
        InputStream input = connection.getInputStream();
        Bitmap myBitmap = BitmapFactory.decodeStream(input);
        return myBitmap;
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}
4
Jayakumar

Pour créer des dispositions de notification personnalisées, consultez le Android Guide de l'API sur le sujet . Il semble que vous allez utiliser le RemoteViews classe.

3
cade

Ce serait bien si nous pouvions obtenir les données de mise en page, qu'elles soient dictées en code ou en XML.

en partant de ce qui est fourni, je peux dire que vous devez récupérer l'image et la mettre dans la déclaration new Notification(2130837696, paramTrack.getTitle() + " - " + str, System.currentTimeMillis());.

Honnêtement, c'est tout ce que je peux vous donner avec ce que vous avez fourni. Bonne chance!

0
Funkyguy