2012-05-09 13 views
13

que estoy tratando de hacer una notificación con 2 botones en él:de notificaciones de Android con botones en él

  • uno me lleva de vuelta a la actividad
  • el otro lo cierra

tiene Alguien tiene una idea sobre cómo atrapar el evento de clic de botón (recuerde que la Actividad está en pausa)?

+0

Para ser honesto, no me gusta la idea detrás de la efford, o yo no lo entienden. Las notificaciones normales en Android tienen la X en el lado derecho y si haces clic en ellas, se te redirige a la actividad. – user61664

+0

Enseñamos y les mostramos las Pautas para Desarrolladores de Android;) –

Respuesta

4

En cuanto a ICS, la pregunta es fácil de responder porque el comportamiento requerido refleja la notificación por defecto: se puede cerca una notificación deslizar hacia la derecha, y se puede definir qué actividad para enviar al usuario cuando él presiona el simple uso de PendingIntent:

// The PendingIntent to launch our activity if the user selects this 
// notification. Note the use of FLAG_CANCEL_CURRENT so that, if there 
// is already an active matching pending intent, cancel it and replace 
// it with the new array of Intents. 
PendingIntent contentIntent = PendingIntent.getActivities(this, 0, 
     makeMessageIntentStack(this, from, message), PendingIntent.FLAG_CANCEL_CURRENT); 

código tomado de http://developer.android.com/guide/topics/ui/notifiers/notifications.html

+0

gracias por su respuesta, aunque no es lo que pedí ... Lo que quiero hacer es una notificación con 2 botones (ya tiene el diseño), pero Tengo problemas para capturar el evento onClick, quiero que uno de ellos cierre ** ACTIVITY ** y el otro para realizar la acción predeterminada de la notificación. – doronsl

3

Si desea asignar intención específica de un botón:

views.setOnClickPendingIntent(R.id.your_button_id, pendingIntent); 

supongo que sólo es necesaria una intención de ser enviado cuando se hace clic en el botón, así que hay que evitar el establecimiento de la principal intención de notificación

notification.contentIntent = yourPendingIntent; 

En caso contrario (si ajusta "notification.contentIntent = pendingIntent; "como de costumbre" se llamarán ambos intentos, que pueden no ser lo que usted desea/el usuario espera.

Si aún desea presionar otras partes de la notificación para invocar ese intento general (o cualquier otro) puede usar el mismo método de asignación de intención por visión que el anterior. No se olvide de establecer

android:clickable="true" 

a cualquier vista en la que desea realizar el seguimiento onClick() para.

Puede rastrear estos intentos por sus extras en la actividad a la que llama. Si que usted está llamando principal/actividad lanzador de lo que va a realizar un seguimiento de ellos aquí (ya que proviene de javadoc para este método):

@Override 
protected void onNewIntent(Intent intent) { 
    super.onNewIntent(intent); 
    Bundle data = intent.getExtras(); 

    if (data != null && data.containsKey(YOUR_INTENT_KEY_SOURCE_CONSTANT)) { 
     // process your notification intent 
    } 

    // go on with smth else 
} 
41

me alegro de ponerla en línea Después de trabajar toda la noche encontré algo. ¡Así que, aquí vamos!

1. Cree un archivo de diseño xml para su notificación.

2. Cree la notificación utilizando Notification.Builder. Después de añadir todo lo que quieras (iconos, sonidos, etc.) hacen esto:

 //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. Cree un método setListeners. Dentro de este método hay que escribir esto:

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

    //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. Para mis requisitos que no se le HelperActivity que responde a las intenciones.Pero para ti no creo que sea necesario.

Si quiere el código fuente completo, puede navegar o descargarlo desde mi repositorio git. El código es para uso personal, así que no espere leer un código precioso con muchos comentarios. https://github.com/BILLyTheLiTTle/AndroidProject_Shortcuts

TODO EL ARRIBA, RESPONDE A LA PREGUNTA DE LA CAPTURA DEL EVENTO DE DIFERENTES BOTONES.

sobre la cancelación de la notificación que permite redirigir aquí

How to clear a notification in Android

Sólo recuerde utilizar el ID que Analizada en el método de notificar al llamar a la notificación de tiempo del puño

+7

¡Esto funciona brillantemente en ICS 4.0.4! Debería considerar formatear su respuesta correctamente para que otros usuarios puedan analizar su respuesta. –

+7

Tienes razón. Debería haberlo hecho desde el principio. Espero que sea mejor ahora. Debido a su comentario agregué el enlace para descargar el código fuente. Todos los lectores a partir de ahora deberían agradecerte, no yo. Feliz año final y el año nuevo más feliz – LiTTle

+1

¡Qué amable de su parte! ¡¡Feliz año nuevo!! –

3

Usted puede simplemente añadir la acción Botones en su Notification estableciendo acción en su Notification.Builder y definiendo PendingIntent para cada acción

a continuación es el código de muestra:

NotificationCompat.Builder mBuilder = 
       new NotificationCompat.Builder(this) 
       .setSmallIcon(R.drawable.notification_icon) 
       .setContentTitle("My notification") 
       .setContentText("Hello World!") 
     .addAction(R.drawable.action_posetive,"posetive",PendingIntent.getActivity(0,intent,0)) 
.addAction(R.drawable.action_clear,"clear",PendingIntent.getActivity(0,intent,0)); 
     NotificationManager mNotificationManager = 
      (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
     mNotificationManager.notify(0, mBuilder.build()); 
+0

¡Muchas gracias! – DmitryKanunnikoff

2

No es un ejemplo completo para usted aquí

//Add this code to onCreate or some onclick Buttton 
    NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
    NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext()); 
    long when = System.currentTimeMillis(); 
    builder.setSmallIcon(R.drawable.ic_notification); 
    Intent notificationIntent = new Intent(getApplicationContext(), notificationActivity.class).putExtra("notification", "1"); 
    PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(), 1, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
    builder.setContentIntent(contentIntent); 
    Notification notification = builder.getNotification(); 
    notification.when = when; 

    RemoteViews remoteViews = new RemoteViews(getApplicationContext().getPackageName(), R.layout.notification_view); 
    remoteViews.setTextViewText(R.id.tvName, "New Name"); 
    listener(remoteViews,getApplicationContext()); 


    notification.contentView = remoteViews; 
    notification.flags |= Notification.FLAG_AUTO_CANCEL; 
    manager.notify(1, notification); 

y entonces usted puede definir el método detector:

public void listener(RemoteViews remoteViews, Context context) { 
    // you have to make intetns for each action (your Buttons) 
    Intent intent = new Intent("Accept"); 
    Intent intent2 = new Intent("Reject"); 

    PendingIntent pendingIntent = PendingIntent.getBroadcast(context,1,intent,0); 
    PendingIntent pendingIntent2 = PendingIntent.getBroadcast(context,1,intent2,0); 

    // add actions here ! 
    IntentFilter intentFilter = new IntentFilter(); 
    intentFilter.addAction("Accept"); 
    intentFilter.addAction("Reject"); 


    BroadcastReceiver receiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      if(intent.getAction().equals("Accept")){ 
       Toast.makeText(context, "Accepted !!", Toast.LENGTH_SHORT).show(); 
      } else if(intent.getAction().equals("Reject")) { 
       Toast.makeText(context, "Rejected !!", Toast.LENGTH_SHORT).show(); 
      } 
     } 
    }; 

    context.registerReceiver(receiver,intentFilter); 
    remoteViews.setOnClickPendingIntent(R.id.ivRequest,pendingIntent); 
    remoteViews.setOnClickPendingIntent(R.id.ivReject,pendingIntent2); 

} 

y aquí está la disposición notification_view a costumize su notificación.

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:padding="16dp"> 

<TextView 
    android:id="@+id/textView" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerVertical="true" 
    android:text="Request from " 
    /> 

<TextView 
    android:id="@+id/tvName" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerVertical="true" 
    android:layout_marginStart="15dp" 
    android:layout_toRightOf="@id/textView" 
    android:text="Amin" 
    /> 

<ImageView 
    android:id="@+id/ivRequest" 
    android:layout_width="30dp" 
    android:layout_height="30dp" 
    android:layout_alignParentEnd="true" 
    android:layout_centerVertical="true" 
    android:src="@drawable/notification" 
    /> 

<ImageView 
    android:id="@+id/ivReject" 
    android:layout_width="30dp" 
    android:layout_height="30dp" 
    android:layout_marginEnd="10dp" 
    android:layout_toLeftOf="@id/ivRequest" 
    android:layout_centerVertical="true" 
    android:src="@drawable/trash" 
    /> 

    </RelativeLayout> 
+1

Este ejemplo hace lo que dice con una función de copiar y pegar (después de agregar los elementos extraíbles). Sin embargo, 'builder.setCustomContentView (remoteViews);' sería mejor que 'notification.contentView = remoteViews;' y 'builder.build()' es mejor que 'builder.getNotification()' debido a deprecations. (Debe reorganizar el código un poco para estos cambios). – Gary99

+0

Sí, copié el código de mi propio SimpleProject y gracias por las actualizaciones :) – Amin

Cuestiones relacionadas