Frage Öffnen Sie ein Dialogfeld mit einem Klick auf eine Schaltfläche in der Benachrichtigung in Android


Wie Sie in der Benachrichtigung die Schaltfläche Genehmigen / Ablehnen sehen, möchte ich ein Dialogfeld öffnen, um die Benutzereingabe zu bestätigen, ohne eine Aktivität zu öffnen.

enter image description here

Hier ist mein Code, wo MyDialog eine Aktivität ist, aber anstatt diese Aktivität zu öffnen, möchte ich ein Dialogfeld öffnen.

public void createNotification(View view) {

    Intent yesIntent = new Intent(this, MyDialog.class);
    yesIntent.putExtra("NOTI_ID", NOTIFICATION_ID);
    yesIntent.putExtra("ACTION", 1);
    PendingIntent yesPIntent = PendingIntent.getActivity(this, (int) System.currentTimeMillis(), yesIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    Intent noIntent = new Intent(this, MyDialog.class);
    noIntent.putExtra("ACTION", 0);
    noIntent.putExtra("NOTI_ID", NOTIFICATION_ID);
    PendingIntent nopIntent = PendingIntent.getActivity(this, (int) System.currentTimeMillis(), noIntent, 0);



    NotificationCompat.Builder noti = new NotificationCompat.Builder(this)
            .setContentTitle("New Project Approval")
            .setContentText("Project Description")
            .setContentIntent(PendingIntent.getActivity(MainActivity.this, 0, yesIntent, PendingIntent.FLAG_CANCEL_CURRENT))
            .setSmallIcon(R.mipmap.bell)
            .setAutoCancel(true)
            .addAction(R.mipmap.approve_ic, "Approve", yesPIntent)
            .addAction(R.mipmap.rejecticon, "Reject", nopIntent) ;

    NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    notificationManager.notify(NOTIFICATION_ID, noti.build());

}

11
2017-12-15 14:33


Ursprung


Antworten:


Wenn Sie den Dialog ohne Aktivität öffnen möchten. Folgendes berücksichtigen

1. Erstellen Sie eine Aktivität und legen Sie sie fest Manifest Wert als

<activity android:name=".MyDialog"
            android:launchMode="singleInstance" android:excludeFromRecents="true"
            android:taskAffinity="" android:theme="@style/Theme.AppCompat.Dialog">
        </activity>
  1. In der oncreate-Methode dieser Aktivität Erstellen und zeigen Sie den Dialog mit folgendem Builder

     AlertDialog LDialog = new AlertDialog.Builder(this)
                .setTitle("Title")
                .setMessage("Message")
                .setOnCancelListener(this)
                .setOnDismissListener(this)
                .setPositiveButton("ok", null).create();
        LDialog.show();
    
     @Override
        public void onCancel(DialogInterface dialogInterface) {
            if(!MyDialog.this.isFinishing()){
                finish();
            }
        }
    
        @Override
        public void onDismiss(DialogInterface dialogInterface) {
            if(!MyDialog.this.isFinishing()){
                finish();
            }
        }
    

Erstelle jetzt eine Benachrichtigung mit deiner createNotification (Ansicht anzeigen) Funktion.

enter image description here


3
2017-09-14 16:32



Sie können die Aktivität auch aus einer ausstehenden Absicht öffnen und das Theme transluzent verwenden. Und öffne den Dialog von dieser Aktivität

public class OffersDialogActivity extends BaseActivity {
    private AlertDialog alertDialog;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dialog);

    }
    @Override
    protected void onResume() {
        super.onResume();
        setUpDialog();
    }

    private void setUpDialog() {
        AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
        LayoutInflater inflater = this.getLayoutInflater();

        dialogBuilder.setView(dialogView);
        alertDialog = dialogBuilder.create();
        alertDialog.setCancelable(false);
        alertDialog.setCanceledOnTouchOutside(false);
        if(!isFinishing())
        {
            alertDialog.show();
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == android.R.id.home) {
            onBackPressed();
        }
        return super.onOptionsItemSelected(item);
    }
    @Override
    public void onBackPressed() {
        super.onBackPressed();
        if(alertDialog != null){
            alertDialog.dismiss();
        }
        finish();
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(alertDialog != null) {
            alertDialog.dismiss();
        }
    }
}

Und benutze Thema:

<style name="TransparentTheme" parent="@style/NoActionBarTheme">
        <item name="android:background">@null</item>
        <item name="background">@null</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:colorBackgroundCacheHint">@null</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowAnimationStyle">@null</item>
        <item name="android:windowNoTitle">true</item>
    </style>

1
2017-09-14 04:58



Sie können BroadcastReceiver für pendingIntent verwenden. Erstellen Sie Ihre Benachrichtigung so

private void showNotification(){
    Intent intent = new Intent(this,TestBroadCast.class);
    intent.setAction("Approve");
    //**Add more extra data here if required**
    PendingIntent storePendingIntent = PendingIntent.getBroadcast(this, 0,
            intent, PendingIntent.FLAG_CANCEL_CURRENT);

    NotificationCompat.Action action = new NotificationCompat.Action(R.drawable.ic_cast_dark,"Archive",storePendingIntent);
    Intent intent1 = new Intent(this,TestBroadCast.class);
    intent1.setAction("Reject");
    //**Add more extra data here if required**
    PendingIntent storePendingIntent1 = PendingIntent.getActivity(this, 0,
            intent1, PendingIntent.FLAG_CANCEL_CURRENT);


    NotificationCompat.Action viewNowAction = new NotificationCompat.Action(R.drawable.ic_cast_dark,"Reject",storePendingIntent1);

    NotificationManager mNotificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    int notifyID = 1;
    NotificationCompat.Builder mNotifyBuilder = new NotificationCompat.Builder(this)
            .setContentTitle("New Project Approval")
            .setContentText("New Project Description")
            .setSmallIcon(R.drawable.ic_cast_dark);
    int numMessages = 0;
    mNotifyBuilder.addAction(action);
    mNotifyBuilder.addAction(viewNowAction);
    mNotificationManager.notify(
            notifyID,
            mNotifyBuilder.build());

}

Und dann wird Ihr BroadcastReceiver so aussehen

public class TestBroadCast extends BroadcastReceiver {

public void onReceive(Context context, Intent intent) {
    final String action = intent.getAction();
    String title;
    if(action.equalsIgnoreCase("Approve")){
        title = "Approve title";
    }
    else{
        title = "Reject title";
    }
    AlertDialog a = new AlertDialog.Builder(context)
            .setTitle(title)
            .setPositiveButton("YES", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    // ok button
                    if(action.equalsIgnoreCase("Approve")){
                        //Approve YES action
                    }
                    else{
                        //Reject YES action;
                    }
                }
            })
            .setNegativeButton("NO", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    // cancel button
                    if(action.equalsIgnoreCase("Approve")){
                        //Approve NO action
                    }
                    else{
                        //Reject NO action;
                    }
                }
            }).create();
     //You have to use below line, otherwise you will get "Unable to add window -- token null is not for an application" 
    a.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

    a.show();
}
}

Und in Ihrer Manifestdatei fügen Sie Folgendes hinzu

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<receiver android:name=".TestBroadCast">
    </receiver>

Es sollte für Sie arbeiten


1
2017-09-15 02:18



Sie haben keine andere Möglichkeit, Dialog direkt zu öffnen, da der Dialog Kontext aus Fragmenten oder aus Aktivitäten benötigt.

In diesem Szenario müssen Sie eine transparente Aktivität öffnen und innerhalb dieser Aktivität müssen Sie eine Ansicht wie Dialog erstellen.

Schritt 1: Fügen Sie den folgenden Stil in Ihre Datei res / values ​​/ styles.xml ein (falls Sie noch keine haben, erstellen Sie sie.) Hier ist eine vollständige Datei:

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <style name="Theme.Transparent" parent="android:Theme">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:backgroundDimEnabled">false</item>
  </style>
</resources>

(Der Wert @ color / transparent ist der Farbwert # 00000000, den ich in die Datei res / values ​​/ color.xml lege. Sie können @android: color / transparent auch in späteren Android-Versionen verwenden)

Schritt 2: Wenden Sie dann den Stil auf Ihre Aktivität an, zum Beispiel:

<activity android:name=".SampleActivity" android:theme="@style/Theme.Transparent">
...
</activity>

0
2017-09-14 09:44