2014-04-22 17 views
11

Tôi đang cố gắng tạo thông báo tùy chỉnh cho ứng dụng Android của mình bằng cách sử dụng post này và tôi đã gặp phải sự cố mà tôi đã cố gắng giải quyết trong 2 giờ qua.Bố cục thông báo tùy chỉnh Android với RemoteViews

Chỉ hiển thị hình ảnh của bố cục của tôi và tôi không thể tìm ra cách làm cho nó hoạt động như dự định.

Mã của tôi:

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

Các tập tin 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

Thanks for the help

+0

Nếu bạn đăng statusbar.xml rằng muốn thực hiện giúp bạn khắc phục bố trí dễ dàng hơn rất nhiều ... – Travis

+0

Xong! Như tôi đã nói, như trong bài đăng gốc – HappyRave

+0

@ HappyRave - bạn có thể giải quyết nó không? Tôi đang đối mặt với cùng một vấn đề. Thx – Amit

Trả lời

12

Vấn đề là bạn chưa thiết lập contentView đúng.

mBuilder.setContent(contentView); 

Nhưng chế độ xem từ xa của bạn là mContentView. thay đổi nó để

mBuilder.setContent(mContentView); 

Đây là một mẫu

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

Đó không phải là nó, nó chỉ là một lỗi đánh máy ở đây trên tràn ngăn xếp! Nếu điều này nằm trong mã thực tế của tôi, nó thậm chí sẽ không biên dịch ^^ – HappyRave

+0

Bạn đã thử mã mẫu của tôi – Libin

+0

Ngoài ra, hãy xóa kiểu khỏi bố cục những gì bạn đã đặt cho TextView. nó phải là một Phong cách hợp lệ nếu được yêu cầu – Libin

0

Tôi nghĩ rằng đây chỉ là một vấn đề bố trí, càng có nhiều mà tôi nghĩ về nó. Tôi nghĩ rằng nếu bạn đã thiết lập android:layout_alignParentRight="true" trên TextView s, bạn sẽ có được những gì bạn đang tìm kiếm. Dường như nó đang đặt chúng ở bên phải của ImageView, nhưng không cho chúng rộng bất kỳ lúc bố trí nào vì chúng không yêu cầu bất kỳ thứ gì và chúng không có bất kỳ nội dung nào.

Nếu điều đó không hiệu quả, hãy cho chúng tôi biết!

+0

Bây giờ toàn bộ tệp java có sẵn :) – HappyRave

0

This bài giải thích rất thú vị.

Về cơ bản và như vậy:

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); 
Các vấn đề liên quan