15

我创建了一个这样的通知通道:

NotificationChannel channel = new NotificationChannel(CHANNEL_ID_FOOBAR, getContext().getString(R.string.notification_channel_foobar), NotificationManager.IMPORTANCE_DEFAULT);
notificationManager.createNotificationChannel(channel);

我为R.string.notification_channel_foobar提供了不同的翻译,并且频道是使用创建时使用的语言创建的,因此如果我最终更改设备的语言,该频道将保持旧语言。有没有办法克服这个问题,或者这是一个限制,即设计?

4

4 回答 4

23

要将新语言应用到您的通知频道,您需要在您的应用中收听 ACTION_LOCALE_CHANGED 广播,并在您的接收器中再次调用 createNotificationChannel。

重新创建频道会将您的字符串更新为新语言(不会修改任何其他频道功能)。您可以在文档中看到它。

于 2017-10-10T15:32:23.997 回答
2

每次启动主要活动时,您都可以简单地创建频道。非常优雅的解决方案,无需使用任何广播接收器。这样,即使您添加了更多语言,频道也将始终从您的字符串资源中获取新值。(过早的优化是万恶之源。)

如果通道尚未创建,该createNotificationChannel命令将创建通道,如果通道已创建,它将更新通道。

如果频道已经创建,那么您唯一可以更改的就是频道名称和频道描述,没有别的。重要性将被忽略,因为用户可能已经手动更改了频道的重要性。但即使他没有改变,重要性也不会更新,这实际上就是通知渠道的目的。让用户可以自由管理他们的频道,而开发人员在更新应用程序时不会打扰他们。

总而言之,通过声明:

NotificationChannel notificationChannel = new NotificationChannel("channel id", "channel new name", NotificationManager.IMPORTANCE_DEFAULT);
notificationManager.createNotificationChannel(notificationChannel);

在已经创建的频道中,频道的名称将被更新,但重要性不会被更新。如果您还想更新频道描述,您可以这样做:

notificationChannel.setDescription("new description"); //set that before creating the channel
于 2018-02-01T18:29:13.700 回答
1

创建频道后,您将无法更改任何内容。当我们为频道名称提供“字符串”时,系统将始终将此名称表示给用户。

您可以尝试的一件(坏)事情是删除旧频道并创建另一个以当前语言命名的频道。

您可以在问题跟踪器中请求此功能增强

更新- @jmart 的答案是正确的。https://stackoverflow.com/a/46670618/3410197

于 2017-09-21T05:20:01.530 回答
0

这是我的解决方案:

public class AlarmReceiver extends BroadcastReceiver {

public static String NOTIFICATION_CHANNEL_ID = "notification-id";
public static String NOTIFICATION = "Notification";
public static String DESCRIPTION = "Channel description";

@TargetApi(26)
@Override
public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub
    Log.e("RECEIVE", "received2");


    NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);


    //PendingIntent pendingIntent = PendingIntent.getActivity(context,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
    PendingIntent pi = PendingIntent.getActivity(context, intent.getIntExtra("NotifID", 1), new Intent(context, CalendarActivity.class),PendingIntent.FLAG_CANCEL_CURRENT);

    // get current locale
    String locale; // for getting locale
    locale = Locale.getDefault().getLanguage();
    if(locale.equalsIgnoreCase("sk")) {
        NOTIFICATION = "Notifikácia";
        DESCRIPTION = "Popis";
    }

        if (VERSION.SDK_INT >= 26) {
            NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, NOTIFICATION, NotificationManager.IMPORTANCE_HIGH);
            notificationChannel.setDescription(DESCRIPTION);
            notificationChannel.enableLights(true);
            notificationChannel.setLightColor(Color.GREEN);

            notificationChannel.setLockscreenVisibility(Notification.DEFAULT_SOUND);
            notificationChannel.setVibrationPattern(new long[]{1000, 500, 500, 200, 200, 200});
            notificationChannel.enableVibration(true);
            manager.createNotificationChannel(notificationChannel);

        }



        NotificationCompat.Builder builder = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID);
        builder.setAutoCancel(true)
            .setDefaults(Notification.DEFAULT_ALL)
            .setWhen(System.currentTimeMillis())
            .setContentTitle(intent.getStringExtra("AppName"))
            .setContentText(intent.getStringExtra("lname"))
            .setSmallIcon(R.drawable.ic_launcher)
            ;

        //manager.notify(1,builder.build());
    manager.notify(intent.getIntExtra("NotifID", 1), builder.build());

}

}

于 2019-05-14T04:21:20.477 回答