通知中的待定内容

时间:2010-05-13 12:41:42

标签: android

我想显示一个显示进度的通知 正在进行中这对我很有用。 但同时远程视图应包含取消按钮以停止正在进行的操作。通常的内容意图仍然应该做其他事情,即不取消正在进行的操作。虽然我似乎只有一个意图。

我必须指定单击时启动的contentIntent 通知:如果我没有说明我得到的东西 行:

E/ActivityManager(   62): Activity Manager Crash
E/ActivityManager(   62): java.lang.IllegalArgumentException: contentIntent required ...

对于“取消”按钮,我设置了另一个意图:

Intent cancelSyncIntent = new Intent("com.xyz.CANCEL_SYNC");
contentView.setOnClickPendingIntent(R.id.cancel_sync,
                                    PendingIntent.getBroadcast(context, 0,
                                    cancelSyncIntent, 0));

但这永远不会奏效。我总是在按钮时获得内容意图 点击。看起来我无法在远程视图中使用按钮 通知?!

我可能会显示一个文字:“<<按取消操作>>”,但这看起来相当沉重。

更新:Afer J.的建议:

    final Notification n = new Notification(R.drawable.gen_auto_notification_icon, context.getResources()
            .getString(
                    fastSyncOnly ? R.string.fast_synchronization_running_notification_title
                            : R.string.synchronization_running_notification_title), new Date().getTime());

    n.flags = Notification.FLAG_ONGOING_EVENT;

    final RemoteViews contentView = new RemoteViews(context.getPackageName(), R.layout.in_progress_notification);
    n.contentView = contentView;

    // Intent cancelSyncIntent = new Intent("com.newsrob.CANCEL_SYNC");
    Intent cancelSyncIntent = new Intent();
    cancelSyncIntent.setClass(context, FireReceiver.class);
    PendingIntent pendingCancelSyncIntent = PendingIntent.getActivity(context, 0, cancelSyncIntent, 0);
    contentView.setOnClickPendingIntent(R.id.cancel_sync, pendingCancelSyncIntent);

    Intent showDashboardIntent = new Intent(context, DashboardListActivity.class);
    PendingIntent showDashboardPendingIntent = PendingIntent.getActivity(context, 0, showDashboardIntent, 0);
    n.contentIntent = showDashboardPendingIntent;

2 个答案:

答案 0 :(得分:3)

简短回答:您无法在通知视图中看到可点击的子视图。

更长的答案......

我花了一天的时间试图让它工作,并最终放弃并查看Android源代码。看起来一切都发生在StatusBarService.java中的makeNotificationView()中。在那里,代码为通知下拉阴影中的每一行扩展名为“status_bar_latest_event”的布局。它从该视图中抓取一个名为“content”的视图集,在其上调用setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS),然后将您的通知视图添加为该子视图。因此,假设我了解FOCUS_BLOCK_DESCENDANTS的工作原理,您的视图或其任何子项都无法获得焦点或点击事件。

我还遵循了与您的通知关联的主要PendingEvent如何工作的逻辑。托管Notification视图的同一ViewGroup会在其上调用setOnClickListener()来注册名为“Launcher”的侦听器类。当该类获取onClick()事件时,它只是调用与Notification关联的PendingIntent上的send()方法。我希望也许点击的坐标可能会被传递,所以我至少可以尝试计算点击了哪个按钮,但没有这样的运气。

无论如何,如果有人知道如何解决这个问题,我很乐意听到。现在,我只是拉出按钮然后继续前进。

答案 1 :(得分:0)

Intent cancelSyncIntent = new Intent();         cancelSyncIntent .setClassName(“com.xyz”,“com.xyz.CANCEL_SYNC”);

PendingIntent pendingIntent = PendingIntent.getActivity(context,
    0 /* no requestCode */, cancelSyncIntent , 0 /* no flags */);
contentView.setOnClickPendingIntent(R.id.cancel_sync, pendingIntent);
相关问题