2016-07-31 29 views
0

我目前已經造成的事實,NotificationCompat不支持setSmallIcon一個圖標,而不是資源ID這WET代碼:setSmallIcon(圖標:圖標),並NotificationCompat

val notification = if (Build.VERSION.SDK_INT < 23) { 
      NotificationCompat.Builder(this) 
        .setLargeIcon(bitmap) 
        .setSmallIcon(R.drawable.ic_launcher) 
        .setContentText(intentDescriber!!.userFacingIntentDescription) 
        .setContentTitle(label) 
        .setContentIntent(contentIntent) 
        .setAutoCancel(true) 
        .build() 
     } else { 
      Notification.Builder(this) 
        .setSmallIcon(Icon.createWithBitmap(bitmap)) 
        .setLargeIcon(bitmap) 
        .setContentText(intentDescriber!!.userFacingIntentDescription) 
        .setContentTitle(label) 
        .setContentIntent(contentIntent) 
        .setAutoCancel(true) 
        .build() 
     } 

有沒有一種方法,使這個更好(DRY?) - 問題在於兩個構建器類都不同。

+0

圖標類SDK 23被引入,所以COMPAT不能支持它。 – lionscribe

+0

但它可能需要一個位圖,並在23個IMPL它可以使用圖標和包裹位圖這個SDK級以上 – ligi

+0

你總是可以使自己的器類... – lionscribe

回答

0

如果您對使用反射感到舒適,那麼不是在構建器中設置小圖標,而是將其設置在構建的通知本身中。您可以在那裏查看SDK 23,並使用反射調用setSmallIcon(這是一個公共方法,但是隱藏,我懷疑它會改變),否則在通知中設置圖標字段。

+0

通知還沒有公佈setSmallIcon - 只有Builder已經 – ligi

+0

對不起,這些文件騙了我。它有一個getSmallIcon但不是setSmallIcon。 setSmallIcon的鏈接是建設者。 – lionscribe

+0

不用擔心 - 但也許刪除答案來清理東西 – ligi

0

缺乏反思我建議創建自己的建設者接口與兩個實現:一個爲NotificationCompat.Builder和一個爲Notification.Builder。你可能會重複「機器人」,但你不會重複自己。例如: -

interface NotificationFacadeBuilder<out T> { 
    /* facade builder method declarations go here */ 
    fun build(): T 
} 

class SupportAppNotificationCompatFacadeBuilder(context: Context) 
: NotificationFacadeBuilder<NotificationCompat> { 
    val builder = NotificationCompat.Builder(context) 
    /* facade builder method implementations go here and delegate to `builder` */ 
    override fun build(): NotificationCompat = TODO() 
} 

class AppNotificationFacadeBuilder(context: Context) 
: NotificationFacadeBuilder<Notification> { 
    val builder = Notification.Builder(context) 
    /* facade builder method implementations go here and delegate to `builder` */ 
    override fun build(): Notification = TODO() 
} 

NotificationFacadeBuilder(或任何你決定將它命名)將不得不宣佈你需要,然後將每個實現類將簡單地委託那些各自的實際建設者實現每個公共建設者方法。