В Android-студии уведомлений не работает разрыв строки - PullRequest
0 голосов
/ 02 июля 2018

Я пытаюсь сделать уведомление с разрывом строки в .setContentText (), но это не работает.

Построитель моего уведомления

builder.setContentTitle("Notification")               
                .setSmallIcon(R.drawable.notif)
                .setContentText("Example1 "+"\n"+" Example2")  
                .setDefaults(Notification.DEFAULT_ALL)
                .setAutoCancel(true)
                .setContentIntent(contentIntent)
                .setTicker("testing it")
                .setVibrate(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400})
                .setPriority(Notification.PRIORITY_HIGH);

В уведомлении: Example1 Example2

но мне нужно

 Example1
 Example2

Ответы [ 3 ]

0 голосов
/ 02 июля 2018

Вы можете попытаться выполнить разрыв строки, используя strings.xml для объявления вашего текста. Перейдите к файлу res / values ​​/ strings.xml в папке вашего проекта, а затем объявите строку как

 <string name="example">Example1 \n Example2</string>

Затем перейдите к своей деятельности и вместо текста напишите R.string.example или вы можете получить строку, используя String example = getString(R.string.example), и использовать переменную String внутри вашего setContentText.

.setContentText(R.string.example) or .setContentText(example)

Infact, не только этот экземпляр, но вы должны объявить все ваши значения String в string.xml. Обратитесь к строковым ресурсам документация для получения дополнительных знаний.

0 голосов
/ 02 июля 2018

Макет уведомления по умолчанию

Основная проблема с этой идеей многострочного текста с макетом уведомлений по умолчанию состоит в том, что в базовом исходном коде для TextView есть следующий xml:

<com.android.internal.widget.ImageFloatingTextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="top"
    android:layout_marginTop="@dimen/notification_text_margin_top"
    android:ellipsize="marquee"
    android:fadingEdge="horizontal"
    android:gravity="top"
    <!-- Reason why a new line character won't work -->
    android:singleLine="true"
    android:textAlignment="viewStart"
    android:textAppearance="@style/TextAppearance.Material.Notification"
    />

Большой текстовый стиль

Как вы можете видеть, представление по умолчанию жестко закодировано в одну строку. Таким образом, с учетом сказанного, если вы используете BigTextStyle, как указано в ответе выше, он будет работать, поскольку базовый xml использует следующую компоновку:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/status_bar_latest_event_content"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:tag="bigText"
    >
    <include layout="@layout/notification_template_header" />

    <LinearLayout
            android:id="@+id/notification_action_list_margin_target"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="top"
            android:layout_marginTop="@dimen/notification_content_margin_top"
            android:layout_marginBottom="@dimen/notification_action_list_height"
            android:clipToPadding="false"
            android:orientation="vertical">

        <LinearLayout
            android:id="@+id/notification_main_column"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="top"
            android:paddingStart="@dimen/notification_content_margin_start"
            android:paddingEnd="@dimen/notification_content_margin_end"
            android:clipToPadding="false"
            android:minHeight="@dimen/notification_min_content_height"
            android:orientation="vertical"
            >
            <include layout="@layout/notification_template_part_line1" />
            <include layout="@layout/notification_template_progress"
                android:layout_width="match_parent"
                android:layout_height="@dimen/notification_progress_bar_height"
                android:layout_marginTop="@dimen/notification_progress_margin_top"
                android:layout_marginBottom="6dp"/>
            <com.android.internal.widget.ImageFloatingTextView
               android:id="@+id/big_text"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="@dimen/notification_text_margin_top"
              android:paddingBottom="@dimen/notification_content_margin_bottom"
             android:textAppearance="@style/TextAppearance.Material.Notification"
              <!-- Reason why it works here -->                    
                android:singleLine="false"
                android:gravity="top"
                android:visibility="gone"
                android:textAlignment="viewStart"
                />
        </LinearLayout>

        <ViewStub android:layout="@layout/notification_material_reply_text"
                android:id="@+id/notification_material_reply_container"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
    </LinearLayout>
    <include layout="@layout/notification_material_action_list" />
    <include layout="@layout/notification_template_right_icon" />
</FrameLayout>

Таким образом, как вы можете видеть, внутреннее представление задает android:singleLine="true" в случае макета уведомления по умолчанию и android:singleLine="false" при использовании BigTextStyle.

Простейшим способом решения вашей задачи было бы использование BigTextStyle, но вы можете иметь гораздо больший контроль над макетом, если вы используете свой собственный TextView внутри файла макета и вызываете:

builder.setCustomContentView(RemoteViews remoteViews)

Хорошая статья GDE здесь , объясняющая, как использовать RemoteViews, если вы того пожелаете, довольно проста.

Удачи и счастливого кодирования!

0 голосов
/ 02 июля 2018

Насколько я знаю, разрывы строк игнорируются в setContentText(), так как это сжато. Вы можете попробовать BigTextStyle, пример:

builder.setContentTitle("Notification")               
                .setSmallIcon(R.drawable.notif)
                .setStyle(new NotificationCompat.BigTextStyle()
                     .bigText("Example1\nExample2")
                )
                .setDefaults(Notification.DEFAULT_ALL)
                .setAutoCancel(true)
                .setContentIntent(contentIntent)
                .setTicker("testing it")
                .setVibrate(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400})
                .setPriority(Notification.PRIORITY_HIGH);

См. https://developer.android.com/reference/android/app/Notification.BigTextStyle для получения дополнительной информации.

...