Intereting Posts
Почему eglMakeCurrent () не работает с EGL_BAD_MATCH? Как обновить активность после изменения языка (локали) внутри приложения OnActivityResult () & onResume () Реализация одного к одному и групповой чат в android Использовать «onclick» в свойствах в макете для диалогов android Как программно изменить значок приложения на Android? «Отсутствует атрибут contentDescription на изображении» в XML Как добавить один и тот же взгляд к родительскому несколько раз, раздувая его только один раз Поймал исключение RuntimeException из реализации заглушки связующего, когда данные swap в arrayadapter Как сделать EditText не сфокусированным при создании Activity Создание двух пользовательских кнопок Скорость чтения SharedPreferences Как я могу манипулировать предварительным просмотром камеры? Гладкая анимация для тяжелых макетов Есть ли способ использовать в моем приложении не общедоступные ресурсы Android?

Изменение формы уведомления

Я декомпилировал мое системное музыкальное приложение (от Sony Ericsson для Android GB 2.3.7), потому что я хочу изменить макет уведомлений. Я нашел метод, который создает уведомление с помощью этого кода:

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

Теперь мой вопрос: как изменить макет уведомлений? Я хочу создать макет, который выглядит как оригинальный макет уведомлений по Android, но с дополнительным изображением справа от уведомления. Как я могу это сделать?

Solutions Collecting From Web of "Изменение формы уведомления"

Сначала создайте 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; } } 

Надеюсь, эта штука работает для вас.

Изменить: вы также можете посетить, если вы столкнетесь с такой проблемой.

Кроме того, вы можете посетить здесь для получения дополнительной информации.

Редактировать 26 апреля 2016 г. Вы можете использовать NotificationCompat.Builder для создания экземпляра Notification как показано ниже:

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

Чтобы создать собственные макеты уведомлений, ознакомьтесь с Руководством по API Android по этому вопросу . Похоже, вы собираетесь использовать класс RemoteViews .

Здесь я прикрепил скриншоты, первый экран содержит заголовок сообщения, и когда мы нажимаем стрелку вниз в правой части имени приложения, это приводит ко второму скриншоту, который является настраиваемой макетом для push-уведомления. Ниже приводится типовая компоновка Что я разработал для себя.

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

Способ создания уведомления с пользовательской раскладкой,

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

Было бы неплохо, если бы мы могли получить данные макета, независимо от того, продиктовано ли оно кодом или xml.

Хотя я могу сказать, что вам нужно получить изображение и поместить его в new Notification(2130837696, paramTrack.getTitle() + " - " + str, System.currentTimeMillis()); декларация.

Честно говоря, это все, что я могу дать вам с тем, что вы предоставили. Удачи!