Android小米默认通知边距Phone

Android default notification margin of Xiaomi Phone

我正在使用自定义通知并找到一种方法来根据 phone 的默认值设置其 margin/padding。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/notification_custom_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
</LinearLayout>

我在这里找到了一些答案:Android default notification margin

我在虚拟设备和一些 phone 型号(三星、Oppo、Pixel)上进行了测试,该方法似乎运行良好,除了小米 Phone,填充非常大,可能是 5-比其他 phones.I 大 6 倍认为 setViewPadding 方法存在问题,因为值 int padding = context.getResources().getDimensionPixelSize(identifier); 与其他 phone 没有太大区别。 如果您有任何想法请告诉我,我在哪里可以找到系统文件夹中的 android dimen xml 文件?

 RemoteViews contentView = new RemoteViews(context.getPackageName(), R.layout.my_notification_content_layout);
try {
    // We are assuming start and end are same. If we want to be nitty, we will get them separately, and then check which to use for left and which for righht.
    int identifier = context.getResources().getIdentifier("notification_content_margin_start", "dimen", "android");
    if (identifier != 0) {
        int padding = context.getResources().getDimensionPixelSize(identifier);
        contentView.setViewPadding(R.id.notify_layout, padding, 0, padding, 0);
        Log.d("setViewPadding", "Setting padding to: " + padding);
    } else {
        Log.d("setViewPadding", "Failed to find padding");
    }
} catch (Exception e) {
    Log.d("setViewPadding", "Failed to set padding");
}

我有完全相同的问题,希望有人能回答。同时,虽然不是直接的解决方案,但以下可能会有所帮助。

不使用 完全 自定义布局,定义 DecoratedCustomView 如下:

builder.setStyle(new NotificationCompat.DecoratedCustomViewStyle());

它的作用是保留 system-default header 通知,包括应用程序图标、应用程序名称和默认 边距(在 MIUI 12 上测试)。您仍然可以像往常一样设置自定义布局:

builder.setCustomContentView(notificationLayout);

这种方法的优点是还得到了一个1:1系统header(即使在MIUI上),同时保持自定义主布局,这是完全自定义布局很难做到的。它还消除了检查默认通知填充的需要。其他注意事项:

  1. 这仅适用于 API24+。在 API24 以下,使用了旧的通知样式(全高大图标),因此此 编译,但不会像您期望的那样工作。
  2. 确保从布局中删除所有填充,以及自定义设置应用程序图标应用程序标题,因为这些将为您定义。
  3. 虽然您无法通过这种方式更改通知标题(应用程序名称),但添加 副标题 可能会非常方便,如下所示:builder.setSubText("Secondary Title"); 请参阅 [=15 中的示例=] post

转换的示例。

这是完全自定义的布局(切记,几乎可以在任何设备上完美显示,但 MIUI 除外)。

这里用的是DecoratedCustomView。你可以看到 header 完全对齐(用于比较的热点通知),唯一的区别是应用程序名称不再着色。