【问题标题】:Open a Dialog box on click of a button present inside the notification in android单击android通知中存在的按钮打开一个对话框
【发布时间】:2015-12-15 14:33:31
【问题描述】:

正如您在通知中看到的批准/拒绝按钮,我想打开一个对话框来确认用户输入而不打开任何活动。

这是我的代码,其中 MyDialog 是一个 Activity,但我不想打开这个 Activity,我想打开一个对话框。

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

}

【问题讨论】:

  • 正是你想要的答案here
  • 别说了,如果你胆子说它是重复的,那就把它标记为重复。

标签: android notifications dialog


【解决方案1】:

如果您想打开对话框而不显示活动。考虑以下

1.创建一个activity并将其Manifest值设置为

<activity android:name=".MyDialog"
            android:launchMode="singleInstance" android:excludeFromRecents="true"
            android:taskAffinity="" android:theme="@style/Theme.AppCompat.Dialog">
        </activity>
  1. 在此活动的 oncreate 方法中。使用以下构建器创建并显示对话框

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

现在使用您的 createNotification(View view) 函数生成通知。

【讨论】:

    【解决方案2】:

    您没有其他方法可以直接打开 Dialog,因为 Dialog 需要来自片段或活动的上下文。

    在这种情况下,您必须打开一个透明活动,并且在该活动中您必须可以创建类似对话框的视图。

    第 1 步: 在您的 res/values/styles.xml 文件中添加以下样式(如果您没有,请创建它。)这是一个完整的文件:

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

    (@color/transparent的值是我放在res/values/color.xml文件中的颜色值#00000000。你也可以在以后的Android版本中使用@android:color/transparent)

    第 2 步:然后将样式应用到您的 Activity,例如:

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

    【讨论】:

      【解决方案3】:

      您可以将 BroadcastReceiver 用于pendingIntent。 像这样创建您的通知

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

      然后您的 BroadcastReceiver 将如下所示

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

      在你的清单文件中添加以下内容

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

      它应该适合你

      【讨论】:

        【解决方案4】:

        您还可以从待定意图打开活动并使用半透明主题。 并从该活动中打开对话框

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

        并使用主题:

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

        【讨论】:

          【解决方案5】:

          对话框实际上需要上下文才能打开。我用来打开透明活动并像对话框一样显示视图。

          要将活动作为对话框启动,我在AndroidManifest.xml 中这样定义它:

          <activity android:theme="@android:style/Theme.Dialog" />
          

          在你的activity 标签中使用这个属性来避免你的对话框出现在最近使用的应用列表中

          android:excludeFromRecents="true"
          

          如果您想阻止您的对话框/活动在用户单击对话框外时被破坏:

          在您的Activity 中使用setContentView() 之后:

          this.setFinishOnTouchOutside(false);

          现在当我调用startActivity() 时,它会显示为一个对话框,当用户按下返回按钮时会显示上一个活动。

          请注意,如果您使用的是 ActionBarActivity(或 AppCompat 主题),则需要改用 @style/Theme.AppCompat.Dialog

          【讨论】:

            猜你喜欢
            • 2018-10-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-06-18
            • 2018-05-23
            • 1970-01-01
            相关资源
            最近更新 更多