简体   繁体   English

Android自定义通知不适用于约束布局

[英]android custom notification not work with constraint layout

I spend the whole day to figure out why my custom notifications are not being displayed. 我花了一整天的时间弄清楚为什么未显示我的自定义通知。 At the end, it was the problem with constraint layout. 最后,这是约束布局的问题。 When I try to build custom_notification.xml with constraint layout the notification does not show up but if I change to linear layout the notification works. 当我尝试使用约束布局构建custom_notification.xml时,通知不会显示,但是如果我更改为线性布局,则该通知有效。 Can anybody tell me why this is happening? 谁能告诉我为什么会这样吗?

custom_notitication.xml with linear layout (This layout works) 具有线性布局的custom_notitication.xml(此布局有效)

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="8dp">
        <Button
            android:id="@+id/button"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:layout_marginTop="8dp"
            android:text="Button"

        <Button
            android:layout_weight="1"
            android:id="@+id/button2"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="8dp"
            android:text="Button"

            />
    </LinearLayout>

custom_notitication.xml with Constraint Layout(this is not working) 具有约束布局的custom_notitication.xml(不起作用)

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="8dp">


    <Button
        android:id="@+id/button"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:text="Button"
        app:layout_constraintEnd_toStartOf="@+id/button2"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent" />

    <Button
        android:layout_weight="1"
        android:id="@+id/button2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:text="Button"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toEndOf="@+id/button"
        />
</android.support.constraint.ConstraintLayout>

and kotlin code 和科特林代码

  fun getNotification(context: Context): Notification {
        val mNotificationManager1: NotificationManager?

        val notification: Notification

        mNotificationManager1 = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
            createChannel(mNotificationManager1)

        val contentView = RemoteViews(applicationContext.packageName, R.layout.custom_notifaction)

        val mBuilder = NotificationCompat.Builder(applicationContext,"LockScreenTouch")
                .setSmallIcon(R.mipmap.ic_launcher)
                .setCustomBigContentView(contentView)
        notification = mBuilder.build()

        mNotificationManager1.notify(PostNotifactionActivity.ONGOING_NOTIFICATION_ID, notification)
        return notification
    }

    @TargetApi(26)
    @Synchronized
    private fun createChannel(notificationManager: NotificationManager?) {
        val name = "lockScreen"
        val importance = NotificationManager.IMPORTANCE_DEFAULT

        val mChannel = NotificationChannel("LockScreenTouch", name, importance)

        mChannel.enableLights(true)
        mChannel.lightColor = Color.BLUE
        notificationManager!!.createNotificationChannel(mChannel)
    }

and my buid.gradle 和我的buid.gradle

    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    implementation 'com.android.support:support-v4:28.0.0'

Notification layouts use the RemoteViews implementation—the same as widgets. 通知布局使用RemoteViews实现-与小部件相同。

There are very few Views that are compatible with RemoteViews. 与RemoteView兼容的视图很少。 It's only a subset of the native/framework Views (ie no support Views, no library Views, no custom Views), and that subset isn't exhaustive: 它只是本机/框架视图的一个子集(即,不支持视图,没有库视图,没有自定义视图),并且该子集并不详尽:

  • AdapterViewFlipper AdapterViewFlipper
  • FrameLayout 的FrameLayout
  • GridLayout 网格布局
  • GridView 网格视图
  • LinearLayout 的LinearLayout
  • ListView 列表显示
  • RelativeLayout 的RelativeLayout
  • StackView StackView
  • ViewFlipper ViewFlipper
  • AnalogClock AnalogClock
  • Button 按键
  • Chronometer 时计
  • ImageButton 的ImageButton
  • ImageView ImageView的
  • ProgressBar 进度条
  • TextClock TextClock
  • TextView 的TextView

No other Views will work. 没有其他视图将起作用。

https://developer.android.com/reference/android/widget/RemoteViews https://developer.android.com/reference/android/widget/RemoteViews

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM