2013-08-21 18 views
26

Skonfigurowałem moją aplikację muzyczną do systemu (z Sony Ericsson dla Androida GB 2.3.7), ponieważ chcę zmienić układ powiadomienia. Znalazłem metodę, która tworzy powiadomienie z tym kodem:Zmiana układu powiadomień

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

Moje pytanie brzmi: Jak mogę zmienić układ powiadomienia? Chcę utworzyć układ, który będzie wyglądał jak oryginalny układ powiadomień na Androidzie, ale z dodatkowym obrazkiem po prawej stronie powiadomienia. Jak mogę to zrobić?

Odpowiedz

76

Najpierw utwórz xml dla powiadomienia.

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> 

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

Nadzieja ta rzecz działa dla Ciebie.

Edytuj: Możesz również odwiedzić, jeśli napotkasz problem taki jak this.

Aby uzyskać więcej informacji, odwiedź stronę here.

Edycja 26 kwietnia 2016 Można użyć NotificationCompat.Builder tworzenia Notification instancji, jak poniżej:

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

Dzięki za to. Dostaniesz nagrodę, ale dam ci ją za godzinę;) – Cilenco

+2

@Cilenco Bez problemu. W ogóle nie pomogłem ci w zdobyciu nagrody. Po prostu czuję się szczęśliwy, że moje Rozwiązanie działa dla ciebie, to jest to ... :) Uwielbiam pomagać ludziom z tym, co znam. Szczęśliwe kodowanie ...! –

+0

@ shree202 daje mi sugestię. Zbudowałem duży widok powiadomienia za pomocą RemoteView, aby kontrolować odtwarzanie/wstrzymywanie jak ten link (stackoverflow.com/pytania/14508369/...) Wszystko jest w porządku, ale po kliknięciu przycisku urządzenie do tyłu i na zewnątrz od przypadku aplikacji kliknij przycisk (Play/Pause/Forward/Close) nie work.Please mi pomóc. –

0

Byłoby miło, gdybyśmy mogli uzyskać dane układu, czy jest to podyktowane w kodzie czy xml.

wychodząc z tego, co jest przewidziane, mogę powiedzieć, że trzeba uzyskać obraz i umieścić go w deklaracji new Notification(2130837696, paramTrack.getTitle() + " - " + str, System.currentTimeMillis());.

Szczerze, to wszystko, co mogę ci dać z tym, co dostarczyłeś. Powodzenia!

2

Aby utworzyć niestandardowe układy powiadomień, zapoznaj się z przewodnikiem po interfejsie API Androida on the subject. Wygląda na to, że zamierzasz używać klasy RemoteViews.

4

Tutaj mam załączeniu zdjęcia, pierwsze zawartość ekranu tytuł postu a gdy klikniemy strzałkę w dół po prawej stronie nazwy aplikacji, wyświetli się drugi zrzut ekranu, który jest niestandardowym układem powiadomień push. Poniżej znajduje się przykładowy układ, który zaprojektowałem dla mojego.

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

Metoda tworzenia Powiadamianie z niestandardowy układ,

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

Awesome mahn, pomógł dużo. –

Powiązane problemy