ボタン付きのカスタム通知があります。通知を設定し、ボタンでOnClickイベントを使用するには、次のコードを使用しました。
//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);
このコードを使用して、カスタムレイアウトのカスタム通知を作成しましたが、ボタンをクリックできません!ボタンをクリックしようとするたびに通知全体をクリックするので、スクリプトは「activityIntent」ではなく「mainIntent」を起動します。
このコードがすべての端末で機能するわけではないことをインターネットで読みました。エミュレータとHTC Magicで試してみましたが、いつも同じ問題があります。ボタンをクリックできません!
私のコードは正しいですか?誰かが私を助けることができますか?
おかげで、
シモーネ
MyActivity.Java
を拡張するコードをAndroid.app.Activity
クラスに記述しています
ユーザーがボタンをクリックするとbroadcast
を送信するカスタム通知を作成します。 broadcast
を受信するブロードキャストレシーバーがあります。
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");
}
}
レシーバーをAndroidManifest.xml
に登録します
<receiver Android:name=".MainActivity$DownloadCancelReceiver" Android:exported="false">
<intent-filter>
<action Android:name="Download_Cancelled" />
</intent-filter>
</receiver>
内部クラスなので、$
記号を使用する必要があります
ウィジェットのxmlはこちら
<?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>
これをチェック
通知用のxmlレイアウトファイルを作成します。
Notification.Builderを使用して通知を作成します。必要なもの(アイコン、サウンドなど)をすべて追加したら、次のようにします。
//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;
メソッドsetListenersを作成します。このメソッド内では、次のように記述する必要があります。
//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);
完全なソースコードが必要な場合は、それを参照するか、私のgitリポジトリからダウンロードできます。このコードは個人で使用するため、たくさんのコメントがある豪華なコードを読むことを期待しないでください。 https://github.com/BILLyTheLiTTle/AndroidProject_Shortcuts
上記のすべては、異なるボタンからのイベントの捕捉の質問に答えます。
通知のキャンセルについてここにリダイレクトします( Androidで通知をクリアする方法 )。通知を最初に呼び出したときに、notifyメソッドで解析したIDを使用することを忘れないでください。
コレクション内で使用すると、setOnClickPendingIntentが機能しないようです。
setOnClickPendingIntentの代わりにsetPendingIntentTemplateを試してください。詳しくは以下をご覧くださいAndroid開発者リンク...
Clickイベントで検出するサービスを作成する必要があります。たとえば、Create NotificationIntentService.class
とコードの下に配置:
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;
}
}
}
このメソッドをアクティビティに追加します。
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());
}
コレクション内で使用すると、setOnClickPendingIntentが機能しないようです。
代わりにsetPendingIntentTemplateを使用してください。