webentwicklung-frage-antwort-db.com.de

Ereignis OnClick für eine Schaltfläche in einer benutzerdefinierten Benachrichtigung

Ich habe eine benutzerdefinierte Benachrichtigung mit einem Button. Um die Benachrichtigung einzustellen und das Ereignis OnClick auf meine Schaltfläche zu verwenden, habe ich diesen Code verwendet:

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

Mit diesem Code habe ich eine benutzerdefinierte Benachrichtigung mit meinem benutzerdefinierten Layout ... aber ich kann nicht auf die Schaltfläche klicken! Jedes Mal, wenn ich versuche, auf die Schaltfläche zu klicken, klicke ich auf die gesamte Benachrichtigung und das Skript startet statt "ActivityIntent" den "mainIntent".

Ich habe im Internet gelesen, dass dieser Code nicht auf allen Terminals funktioniert. Ich habe es auf dem Emulator und auf einem HTC Magic ausprobiert, aber ich habe immer das gleiche Problem: Ich kann den Knopf nicht klicken! 

Mein Code ist richtig? kann mir jemand helfen?

Vielen Dank,

Simone

27
Simone

Ich schreibe Code in meine MyActivity.Java-Klasse, die Android.app.Activity erweitert.

Es erstellt eine benutzerdefinierte Benachrichtigung, wenn der Benutzer auf die Schaltfläche klickt, wird eine broadcast..__ gesendet. Es gibt einen Broadcast-Empfänger, der die broadcast empfängt.

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

Empfänger in AndroidManifest.xml registrieren

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

Da es sich um eine innere Klasse handelt, muss $ sign verwendet werden

Widget XML ist hier

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

schau dir das an

  1. Erstellen Sie eine XML-Layoutdatei für Ihre Benachrichtigung.

  2. Erstellen Sie die Benachrichtigung mit dem Notification.Builder. Nachdem Sie alles hinzugefügt haben, was Sie möchten (Symbole, Sounds usw.), tun Sie Folgendes:

    //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. Erstellen Sie eine Methode setListeners. Innerhalb dieser Methode musst du folgendes schreiben:

    //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. Für meine Anforderungen habe ich eine HelperActivity verwendet, die den Intentionen entspricht. Aber ich glaube nicht, dass es notwendig ist.

Wenn Sie den vollständigen Quellcode benötigen, können Sie ihn durchsuchen oder von meinem Git-Repo herunterladen. Der Code ist für den persönlichen Gebrauch bestimmt, erwarten Sie also nicht, einen wunderschönen Code mit vielen Kommentaren zu lesen. https://github.com/BILLyTheLiTTle/AndroidProject_Shortcuts

ALLES OBEN BEANTWORTET DIE FRAGE DES FANGES VON VERSCHIEDENEN KNÖPFEN.

Über das Abbrechen der Benachrichtigung leite ich Sie hier weiter ( So löschen Sie eine Benachrichtigung in Android ). Denken Sie daran, die ID zu verwenden, die Sie bei der Benachrichtigungsmethode analysiert haben, als Sie die Benachrichtigung zum ersten Mal aufgerufen haben

7
Mahalakshmi

es scheint, dass setOnClickPendingIntent nicht funktioniert, wenn es in Sammlungen verwendet wird.

Versuchen Sie also setPendingIntentTemplate anstelle von setOnClickPendingIntent. Weitere Informationen finden Sie unter Android-Entwicklerlink ...

Klicken Sie hier, um weitere Informationen zu erhalten - Gehe zur Android-Entwicklerseite.

3
kaushik

Sie müssen einen Dienst erstellen, um das Ereignis "Click" zu erkennen: Erstellen Sie beispielsweise NotificationIntentService.class und geben Sie folgenden Code ein:

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

}

Fügen Sie dieses Metod zu Ihrer Aktivität hinzu: private 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());
}

}

es scheint, dass setOnClickPendingIntent nicht funktioniert, wenn es in Sammlungen verwendet wird:

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

Verwenden Sie stattdessen setPendingIntentTemplate.

0