web-dev-qa-db-fra.com

Event OnClick pour un bouton dans une notification personnalisée

J'ai une notification personnalisée avec un bouton. Pour définir la notification et utiliser l'événement OnClick sur mon bouton, j'ai utilisé ce code:

//Notification and intent of the notification 
Notification notification = new Notification(R.drawable.stat_notify_missed_call,
            "Custom Notification", System.currentTimeMillis());

Intent mainIntent = new Intent(getBaseContext(), NotificationActivity.class);
PendingIntent pendingMainIntent = PendingIntent.getActivity(getBaseContext(),
    0, mainIntent , 0);
notification.contentIntent = pendingMainIntent;

//Remoteview and intent for my button
RemoteViews notificationView = new RemoteViews(getBaseContext().getPackageName(),
    R.layout.remote_view_layout);

Intent activityIntent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:190"));
PendingIntent pendingLaunchIntent = PendingIntent.getActivity(getBaseContext(), 0,
            activityIntent, PendingIntent.FLAG_UPDATE_CURRENT);

notificationView.setOnClickPendingIntent(R.id.button1,
    pendingLaunchIntent);

notification.contentView = notificationView;

notificationManager.notify(CUSTOM_NOTIFICATION_ID, notification);

Avec ce code, j'ai une notification personnalisée avec ma mise en page personnalisée ... mais je ne peux pas cliquer sur le bouton! chaque fois que j'essaie de cliquer sur le bouton, je clique sur l'intégralité de la notification et le script lance "mainIntent" au lieu de "activityIntent".

J'ai lu sur Internet que ce code ne fonctionne pas sur tous les terminaux. Je l'ai essayé sur l'émulateur et sur un HTC Magic, mais j'ai toujours le même problème: je ne peux pas cliquer sur le bouton! 

Mon code est correct? quelqu'un peut m'aider?

Merci,

Simone

27
Simone

J'écris du code dans ma classe MyActivity.Java qui étend Android.app.Activity

Il crée une notification personnalisée lorsque l'utilisateur clique sur le bouton, il envoie une broadcast. Un récepteur de diffusion reçoit la broadcast.

private void createDownloadNotification() {
        Intent closeButton = new Intent("Download_Cancelled");
        closeButton.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

        PendingIntent pendingSwitchIntent = PendingIntent.getBroadcast(this, 0, closeButton, 0);

        RemoteViews notificationView = new RemoteViews(getPackageName(), R.layout.widget_update_notification);

        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        NotificationCompat.Builder builder = new NotificationCompat.Builder(this).setSmallIcon(R.drawable.ic_launcher).setTicker("Ticker Text").setContent(notificationView);
        notificationView.setProgressBar(R.id.pb_progress, 100, 12, false);
        notificationView.setOnClickPendingIntent(R.id.btn_close, pendingSwitchIntent);

        notificationManager.notify(1, builder.build());

    }


public static class DownloadCancelReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {

            System.out.println("Received Cancelled Event");
        }
    }

Enregistrer le destinataire dans AndroidManifest.xml

<receiver Android:name=".MainActivity$DownloadCancelReceiver" Android:exported="false">
            <intent-filter>
                <action Android:name="Download_Cancelled" />
            </intent-filter>
        </receiver>

Comme il s'agit d'une classe interne, vous devez utiliser le signe $

Le widget xml est arrivé

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:gravity="center"
    Android:orientation="horizontal" >

    <Button
        Android:id="@+id/btn_close"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="Close Me" />

    <ProgressBar
        Android:id="@+id/pb_progress"
        style="?android:attr/progressBarStyleHorizontal"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content" />

</LinearLayout>
16
AZ_

regarde ça

  1. Créez un fichier de mise en page XML pour votre notification.

  2. Créez la notification à l'aide de Notification.Builder. Après avoir ajouté tout ce que vous voulez (icônes, sons, etc.), procédez comme suit:

    //R.layout.notification_layout is from step 1
    
    RemoteViews contentView=new RemoteViews(ctx.getPackageName(), R.layout.notification_layout);
    
    setListeners(contentView);//look at step 3
    
    notification.contentView = contentView;
    
  3. Créez une méthode setListeners. Dans cette méthode, vous devez écrire ceci:

    //HelperActivity will be shown at step 4
    
    Intent radio=new Intent(ctx, packagename.youractivity.class);  
    radio.putExtra("AN_ACTION", "do");//if necessary
    
    PendingIntent pRadio = PendingIntent.getActivity(ctx, 0, radio, 0);
    //R.id.radio is a button from the layout which is created at step 2                  view.setOnClickPendingIntent(R.id.radio, pRadio); 
    
    //Follows exactly my code!
    Intent volume=new Intent(ctx, tsapalos11598712.bill3050.shortcuts.helper.HelperActivity.class);
    volume.putExtra("DO", "volume");
    
    //HERE is the whole trick. Look at pVolume. I used 1 instead of 0.
    PendingIntent pVolume = PendingIntent.getActivity(ctx, 1, volume, 0);
    view.setOnClickPendingIntent(R.id.volume, pVolume);
    
  4. Pour mes besoins, j'ai utilisé une HelperActivity qui répond aux intentions. Mais pour vous, je ne pense pas que ce soit nécessaire.

Si vous voulez le code source complet, vous pouvez le parcourir ou le télécharger depuis mon dépôt Git. Le code est destiné à un usage personnel, alors ne vous attendez pas à lire un code magnifique avec beaucoup de commentaires. https://github.com/BILLyTheLiTTle/AndroidProject_Shortcuts

TOUS LES CI-DESSUS RÉPONDENT À LA QUESTION DE L'ACQUISITION D'ÉVÉNEMENTS DE DIFFÉRENTS BOUTONS.

À propos de l'annulation de la notification, je vous redirige ici ( Comment effacer une notification sous Android ). N'oubliez pas d'utiliser l'identifiant que vous avez analysé selon la méthode notify lorsque vous avez appelé la notification pour la première fois.

7
Mahalakshmi

il semble que setOnClickPendingIntent ne fonctionne pas lorsqu'il est utilisé dans des collections.

Essayez donc setPendingIntentTemplate au lieu de setOnClickPendingIntent. pour plus d'informations ci-dessous lien développeur Android ...

Cliquez ici pour plus de détails - Aller sur le site de développement Android.

3
kaushik

Vous devez créer un service pour détecter l'événement Click: Par exemple, Create NotificationIntentService.class et mettez le code ci-dessous:

public class NotificationIntentService extends IntentService {

/**
 * Creates an IntentService.  Invoked by your subclass's constructor.
 */
public NotificationIntentService() {
    super("notificationIntentService");
}

@Override
protected void onHandleIntent(Intent intent) {
    switch (intent.getAction()) {
        case "left":
            Android.os.Handler leftHandler = new Android.os.Handler(Looper.getMainLooper());
            leftHandler.post(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(getBaseContext(),
                            "You clicked the left button", Toast.LENGTH_LONG).show();
                }
            });
            break;
        case "right":
            Android.os.Handler rightHandler = new Android.os.Handler(Looper.getMainLooper());
            rightHandler.post(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(getBaseContext(), "You clicked the right button", Toast.LENGTH_LONG).show();
                }
            });
            break;
    }
}

}

Ajoutez ce metod à votre activité: privé void sendNotification () {

    RemoteViews expandedView = new RemoteViews(getPackageName(), R.layout.view_expanded_notification);
    expandedView.setTextViewText(R.id.timestamp, DateUtils.formatDateTime(this, System.currentTimeMillis(), DateUtils.FORMAT_SHOW_TIME));
    expandedView.setTextViewText(R.id.notification_message, mEditText.getText());
    // adding action to left button
    Intent leftIntent = new Intent(this, NotificationIntentService.class);
    leftIntent.setAction("left");
    expandedView.setOnClickPendingIntent(R.id.left_button, PendingIntent.getService(this, 0, leftIntent, PendingIntent.FLAG_UPDATE_CURRENT));
    // adding action to right button
    Intent rightIntent = new Intent(this, NotificationIntentService.class);
    rightIntent.setAction("right");
    expandedView.setOnClickPendingIntent(R.id.right_button, PendingIntent.getService(this, 1, rightIntent, PendingIntent.FLAG_UPDATE_CURRENT));

    RemoteViews collapsedView = new RemoteViews(getPackageName(), R.layout.view_collapsed_notification);
    collapsedView.setTextViewText(R.id.timestamp, DateUtils.formatDateTime(this, System.currentTimeMillis(), DateUtils.FORMAT_SHOW_TIME));

    NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
            // these are the three things a NotificationCompat.Builder object requires at a minimum
            .setSmallIcon(R.drawable.ic_pawprint)
            .setContentTitle(NOTIFICATION_TITLE)
            .setContentText(CONTENT_TEXT)
            // notification will be dismissed when tapped
            .setAutoCancel(true)
            // tapping notification will open MainActivity
            .setContentIntent(PendingIntent.getActivity(this, 0, new Intent(this, MainActivity.class), 0))
            // setting the custom collapsed and expanded views
            .setCustomContentView(collapsedView)
            .setCustomBigContentView(expandedView)
            // setting style to DecoratedCustomViewStyle() is necessary for custom views to display
            .setStyle(new Android.support.v7.app.NotificationCompat.DecoratedCustomViewStyle());

    // retrieves Android.app.NotificationManager
    NotificationManager notificationManager = (Android.app.NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    notificationManager.notify(0, builder.build());
}

}

0

il semble que setOnClickPendingIntent ne fonctionne pas lorsqu'il est utilisé dans des collections:

http://developer.Android.com/reference/Android/widget/RemoteViews.html#setOnClickPendingIntent(int,%20Android.app.PendingIntent)

Essayez plutôt d'utiliser setPendingIntentTemplate.

0
Alessandro Folloni