更改通知布局

我反编译我的系统音乐应用程序(从索尼爱立信Android 2.3.7),因为我想改变通知布局。 我find了用这个代码创build通知的方法:

private void sendStatusBarNotification(Track paramTrack) { if (paramTrack != null) { NotificationManager localNotificationManager = (NotificationManager)this.mContext.getSystemService("notification"); String str = paramTrack.getArtist(); if ((str == null) || (str.equals(this.mContext.getString(2131361954)))) str = this.mContext.getString(2131361798); Notification localNotification = new Notification(2130837696, paramTrack.getTitle() + " - " + str, System.currentTimeMillis()); localNotification.flags = (0x2 | localNotification.flags); localNotification.flags = (0x20 | localNotification.flags); PendingIntent localPendingIntent = PendingIntent.getActivity(this.mContext, 0, new Intent(this.mContext, MusicActivity.class), 268435456); localNotification.setLatestEventInfo(this.mContext, paramTrack.getTitle(), str, localPendingIntent); localNotificationManager.notify(0, localNotification); } } 

我现在的问题是:如何更改通知布局? 我想要构build一个看起来像原始的android通知布局但在通知右侧有一个额外的图像的布局。 我该怎么做?

首先为你的通知创build一个xml。

custom_notification.xml:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/layout" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="10dp" > <ImageView android:id="@+id/image" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_alignParentLeft="true" android:layout_marginRight="10dp" /> <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/image" style="Custom Notification Title" /> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/image" android:layout_below="@id/title" style="Custom Notification Text" /> </RelativeLayout> 

现在的Java代码:

 public class MainActivity extends Activity { @SuppressWarnings("deprecation") @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); int icon = R.drawable.ic_launcher; long when = System.currentTimeMillis(); Notification notification = new Notification(icon, "Custom Notification", when); NotificationManager mNotificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.custom_notification); contentView.setImageViewResource(R.id.image, R.drawable.ic_launcher); contentView.setTextViewText(R.id.title, "Custom notification"); contentView.setTextViewText(R.id.text, "This is a custom layout"); notification.contentView = contentView; Intent notificationIntent = new Intent(this, MainActivity.class); PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); notification.contentIntent = contentIntent; notification.flags |= Notification.FLAG_NO_CLEAR; //Do not clear the notification notification.defaults |= Notification.DEFAULT_LIGHTS; // LED notification.defaults |= Notification.DEFAULT_VIBRATE; //Vibration notification.defaults |= Notification.DEFAULT_SOUND; // Sound mNotificationManager.notify(1, notification); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } } 

希望这个东西适合你。

编辑:你也可以访问,如果你遇到这样的问题。

此外,您可以访问这里获取更多信息。

编辑2016年4月26日您可以使用NotificationCompat.Builder创buildNotification实例,如下所示:

 NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) .setSmallIcon(icon) .setContent(contentView) .setContentTitle("Custom Notification") .setWhen(when); ... mNotificationManager.notify(1, notificationBuilder.build()); 

在这里,我附上了屏幕截图,第一个屏幕内容是post的标题,当我们点击应用程序名称右侧的向下箭头时,会导致第二个屏幕截图是推送通知的自定义布局。以下是样本布局我为我devise的

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="4dp" xmlns:card_view="http://schemas.android.com/apk/res-auto" android:orientation="vertical" card_view:cardCornerRadius="5dp" card_view:cardUseCompatPadding="true"> <LinearLayout android:layout_width="match_parent" android:orientation="horizontal" android:background="#80000000" android:layout_height="wrap_content"> <ImageView android:src="@mipmap/ic_launcher" android:layout_width="50dp" android:layout_height="match_parent" android:padding="10dp" android:layout_marginLeft="5dp" android:background="@null" android:layout_gravity="center_vertical|center_horizontal" android:scaleType="centerCrop"/> <TextView android:id="@+id/title" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" android:minHeight="48dp" android:paddingBottom="16dp" android:paddingLeft="16dp" android:paddingRight="16dp" android:paddingTop="16dp" android:background="@android:color/transparent" android:textColor="@android:color/white" tools:text="Test"/> </LinearLayout> <ImageView android:id="@+id/image" android:layout_width="match_parent" android:layout_height="fill_parent" android:adjustViewBounds="true" android:contentDescription="@null" android:scaleType="centerCrop" android:src="@drawable/placeholder"/> </LinearLayout> 

用自定义布局创build通知的方法,

 public static void createNotification(String title, String body,String image_url, Context context, int notificationsId, String single_id) { Intent notificationIntent; long when = System.currentTimeMillis(); int id = (int) System.currentTimeMillis(); Bitmap bitmap = getBitmapFromURL(image_url); NotificationCompat.BigPictureStyle notifystyle = new NotificationCompat.BigPictureStyle(); notifystyle.bigPicture(bitmap); RemoteViews contentView = new RemoteViews(context.getPackageName(), R.layout.custom_notification_layout); contentView.setImageViewBitmap(R.id.image, bitmap); contentView.setTextViewText(R.id.title, body); NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context) .setSmallIcon(R.drawable.ic_launcher) .setStyle(notifystyle) .setCustomBigContentView(contentView) .setContentText(body); NotificationManager mNotificationManager = (NotificationManager) context .getSystemService(Context.NOTIFICATION_SERVICE); notificationIntent = new Intent(context, SinglePost.class); notificationIntent.putExtra("single_id",single_id); notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); PendingIntent contentIntent = PendingIntent.getActivity(context, id, notificationIntent, 0); Notification notification = mBuilder.build(); notification.contentIntent = contentIntent; notification.flags |= Notification.FLAG_AUTO_CANCEL; notification.defaults |= Notification.DEFAULT_SOUND; notification.defaults |= Notification.DEFAULT_VIBRATE; mNotificationManager.notify(notificationsId, notification); } public static Bitmap getBitmapFromURL(String strURL) { try { URL url = new URL(strURL); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoInput(true); connection.connect(); InputStream input = connection.getInputStream(); Bitmap myBitmap = BitmapFactory.decodeStream(input); return myBitmap; } catch (IOException e) { e.printStackTrace(); return null; } } 

要创build自定义通知布局,请查看有关该主题的Android API指南。 看起来你要使用RemoteViews类。

如果我们可以得到布局数据,不pipe是用code还是xml指定,

不过,我可以说你必须把图像放到new Notification(2130837696, paramTrack.getTitle() + " - " + str, System.currentTimeMillis()); 宣言。

老实说,就是我可以给你提供的东西。 祝你好运!