2014-04-22 14 views
11

Próbuję utworzyć niestandardowe powiadomienie dla mojej aplikacji na Androida, używając tego post, i natknąłem się na problem, który próbowałem rozwiązać przez ostatnie 2 godziny.Układ niestandardowego powiadomienia Android z RemoteViews

Wyświetlany jest tylko widok mojego układu graficznego i nie wiem, jak sprawić, by działał tak, jak powinien.

Mój kod:

package be.ac.ucl.lfsab1509.cumulus.services; 

import android.app.Notification; 
import android.app.PendingIntent; 
import android.content.Intent; 
import android.support.v4.app.NotificationCompat; 
import android.support.v4.app.TaskStackBuilder; 
import android.widget.RemoteViews; 
import be.ac.ucl.lfsab1509.cumulus.R; 
import be.ac.ucl.lfsab1509.cumulus.activities.MainActivity; 
import be.ac.ucl.lfsab1509.cumulus.entities.Song; 

public class CumulusNotification { 

private CumulusService mCtx; 
private CumulusMediaPlayer mPlayer; 
private Notification mNotification; 
private NotificationCompat.Builder mBuilder; 
private RemoteViews mContentView; 

public CumulusNotification(CumulusService ctx, CumulusMediaPlayer player){ 
    mCtx = ctx; 
    mPlayer = player; 

    mBuilder = new NotificationCompat.Builder(
      mCtx); 
    mBuilder.setSmallIcon(R.drawable.ic_stat_cumulus_notification); 
    //mBuilder.setContentTitle("Cumulus is playing"); 
    //mBuilder.setTicker("Cumulus"); 
    //mBuilder.setContentText(mCtx.getCurrentSong().title()); 

    Intent resultIntent = new Intent(mCtx, MainActivity.class); 
    resultIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK 
      | Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    resultIntent.setAction(Intent.ACTION_MAIN); 
    TaskStackBuilder stackBuilder = TaskStackBuilder.create(mCtx); 
    stackBuilder.addParentStack(MainActivity.class); 
    stackBuilder.addNextIntent(resultIntent); 
    PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, 
      PendingIntent.FLAG_UPDATE_CURRENT); 
    mBuilder.setContentIntent(resultPendingIntent); 

    mContentView = new RemoteViews(mCtx.getPackageName(), R.layout.statusbar); 
    mContentView.setImageViewResource(R.id.notifimage, R.drawable.cumulus_icon); 
    mContentView.setTextViewText(R.id.notiftitle, "Custom notification"); 
    mContentView.setTextViewText(R.id.notiftext, "This is a custom layout"); 
    mBuilder.setContent(mContentView); 
} 

public void startNotification() { 
    mNotification = mBuilder.build(); 
    //mNotification.contentView = mContentView; 
    mCtx.startForeground(R.integer.NOTIFICATION_ID, mNotification); 
} 

public void updateSong(Song song){ 
    mBuilder.setContentText(song.title()); 
    mNotification = mBuilder.build(); 
    mCtx.startForeground(R.integer.NOTIFICATION_ID, mNotification); 
} 
} 

pliku XML:

<?xml version="1.0" encoding="utf-8"?> 
<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" 
android:gravity="left" > 
<ImageView android:id="@+id/notifimage" 
    android:layout_width="wrap_content" 
    android:layout_height="fill_parent" 
    android:layout_alignParentLeft="true" 
    android:layout_marginRight="10dp" /> 
<TextView android:id="@+id/notiftitle" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_toRightOf="@id/notifimage" /> 
<TextView android:id="@+id/notiftext" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_toRightOf="@id/notifimage" 
    android:layout_below="@id/notiftitle" /> 
</RelativeLayout> 

my notification

Dzięki za pomoc

+0

Jeśli opublikować statusbar.xml że by uczynić pomaga rozwiązać układ o wiele łatwiejsze ... – Travis

+0

Gotowe! Tak jak powiedziałem, jak w oryginalnym poście – HappyRave

+0

@HappyRave - czy jesteś w stanie go rozwiązać? Mam do czynienia z tym samym problemem. Thx – Amit

Odpowiedz

12

Problem polega na tym, że nie została ustawiona prawidłowa contentView.

mBuilder.setContent(contentView); 

Ale twój widok zdalny to mContentView. zmień go na

mBuilder.setContent(mContentView); 

Oto próbka

NotificationCompat.Builder mBuilder = 
     new NotificationCompat.Builder(this).setSmallIcon(R.drawable.ic_launcher); 

    RemoteViews mContentView = new RemoteViews(getPackageName(), R.layout.test_tt); 
    mContentView.setImageViewResource(R.id.image, R.drawable.ic_action_search); 
    mContentView.setTextViewText(R.id.title, "Custom notification"); 
    mContentView.setTextViewText(R.id.text, "This is a custom layout"); 
    mBuilder.setContent(mContentView); 

    startForeground(1001, mBuilder.build()); 
+0

To nie to, to był tylko literówka tutaj na przepełnieniu stosu! Jeśli był w moim prawdziwym kodzie, to nawet nie skompilowałbym^^ – HappyRave

+0

Czy wypróbowałeś mój kod przykładowy – Libin

+0

Usunięto również styl z układu, który ustawiłeś dla TextView. powinien być prawidłowy Styl, jeśli jest to wymagane – Libin

0

myślę, że to tylko kwestia układ, tym bardziej, że o tym myślę. Myślę, że jeśli ustawisz android:layout_alignParentRight="true" na TextView s, dostaniesz to, czego szukasz. Wygląda na to, że układa się je na prawo od ImageView, ale nie daje im żadnej szerokości w czasie układania, ponieważ nie pytają o żadną i nie mają żadnej zawartości.

Jeśli to nie zadziała, daj nam znać!

+0

Teraz dostępny jest cały plik java :) – HappyRave

0

This post wyjaśnia bardzo fajnie.

zasadzie i tak:

RemoteViews downloadViews = new RemoteViews(context.getPackageName(), R.layout.download_notification); 
     NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context) 
       .setSmallIcon(R.mipmap.ic_launcher) 
       .setContentTitle("Content Title") 
       .setContentText("Content Text") 
       .setContent(downloadViews) 
       .setPriority(NotificationCompat.PRIORITY_MIN); 
     final Notification notification = mBuilder.build(); 
     notification.bigContentView = downloadViews; 

     NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
     mNotificationManager.notify(1, notification); 
Powiązane problemy