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
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>
regarde ça
Créez un fichier de mise en page XML pour votre notification.
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;
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);
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.
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.
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());
}
}
il semble que setOnClickPendingIntent ne fonctionne pas lorsqu'il est utilisé dans des collections:
Essayez plutôt d'utiliser setPendingIntentTemplate.