2016-06-24 145 views
0

我用Application-Theme更改背景颜色时遇到问题。更改通知RemoteViews背景颜色

NotificationCompat.Builder nBuilder = new NotificationCompat.Builder(this); 

TypedValue typedValue = new TypedValue(); 

getTheme().resolveAttribute(R.attr.colorPrimary, typedValue, true); 

int iPrimaryColor = typedValue.data; 

getTheme().resolveAttribute(R.attr.colorPrimaryDark, typedValue, true); 

int iPrimaryDarkColor = typedValue.data; 

Intent notIntent = new Intent(getApplicationContext(), MainActivity.class); 
notIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

PendingIntent notOpenOnClick = PendingIntent.getActivity(getApplicationContext(), 0, notIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

RemoteViews smallContentView = new RemoteViews(getPackageName(), R.layout.notification_small); 
RemoteViews bigContentView = new RemoteViews(getPackageName(), R.layout.notification_expanded); 

nBuilder.setSmallIcon(R.drawable.not_icon) 
    .setOngoing(true) 
    .setContentTitle(getCurrentSong().getTitle()) 
    .setContentIntent(notOpenOnClick); 

Notification not = nBuilder.build(); 

smallContentView.setInt(R.id.not_linLayout, "setBackgroundColor", iPrimaryColor); 
smallContentView.setInt(R.id.not_imvDivider, "setBackgroundColor", iPrimaryDarkColor); 

bigContentView.setInt(R.id.not_linLayout, "setBackgroundColor", iPrimaryColor); 
bigContentView.setInt(R.id.not_imvDivider, "setBackgroundColor", iPrimaryDarkColor); 

setListeners(smallContentView); 
setListeners(bigContentView); 

not.contentView = smallContentView; 
not.bigContentView = bigContentView; 

if (isPlaying()) { 
    not.contentView.setImageViewResource(R.id.not_btnPlayPause, R.drawable.ic_pause_48dp); 
    not.bigContentView.setImageViewResource(R.id.not_btnPlayPause, R.drawable.ic_pause_48dp); 
} 
else { 
    not.contentView.setImageViewResource(R.id.not_btnPlayPause, R.drawable.ic_play_48dp); 
    not.bigContentView.setImageViewResource(R.id.not_btnPlayPause, R.drawable.ic_play_48dp); 
} 

我已经试过这个,但是我的通知背景仍然是白色的。 这个ID是正确的,View linLayout是一个LinearLayout。

请注意:整个代码是在服务中调用的!

谢谢!

+0

它看起来像你试图建立一个媒体控制通知。请不要使用自定义通知,而是使用[NotificationCompat.MediaStyle](https://developer.android.com/reference/android/support/v7/app/NotificationCompat.MediaStyle.html) – ianhanniballake

+0

好的,但为什么使用MediaStyle会更好吗? –

+0

1)适用于API 7+设备2)在棒棒糖上使用内置样式+ 3)自动适应新的Android N通知样式4)内置支持自定义背景颜色5)内置支持解决问题解除前棒棒糖设备上前台服务的通知6)支持添加MediaSession标记以使Android Wear控件正常工作。仅举几例。 – ianhanniballake

回答

4

利用NotificationCompat.MediaStyle可以轻松完成大部分操作。它从pre-API 24设备上调用setColor()调用的背景颜色(并将该颜色用作API 24+设备上的重音)。这也意味着,你不必再编写任何自定义RemoteViews代码,它完全依赖于你添加到您的通知媒体控制的行动:

NotificationCompat.Builder nBuilder = new NotificationCompat.Builder(this); 
nBuilder.setSmallIcon(R.drawable.not_icon) 
    .setContentTitle(getCurrentSong().getTitle()) 
    .setContentIntent(notOpenOnClick); 
// This is what sets the background color on <N devices 
// It is an accent color on N+ devices 
nBuilder.setColor(getResources().getColor(R.color.colorPrimary)); 
// Add actions via nBuilder.addAction() 
// Set the style, setShowActionsInCompactView(0) means the first 
// action you've added will be shown the non-expanded view 
nBuilder.setStyle(new NotificationCompat.MediaStyle() 
    .setShowActionsInCompactView(0)); 

你一定要读了所有的方法可供MediaStyle并回顾了有关使用通知的示例代码和最佳实践Best Practices in media playback I/O 2016 talk。具体在30 minutes into the talk

+0

你能发表一个示例代码吗?我试图找到有用的东西,但例如背景颜色保持黑色 –

+0

okey谢谢:) –