Computer >> 컴퓨터 >  >> 프로그래밍 >> Android

Android에서 커스텀 알림 레이아웃과 텍스트 색상을 만드는 방법

이 튜토리얼에서는 Android 앱에서 사용자 정의(커스텀) 알림 레이아웃텍스트 색상을 적용하는 방법을 단계별로 살펴봅니다. 기본 알림과 RemoteViews를 활용한 커스텀 알림 두 가지 방식을 함께 구현해 보겠습니다.

1단계: 새 프로젝트 생성

Android Studio를 실행하고 File ⇒ New Project 메뉴로 이동한 뒤, 필요한 모든 세부 정보를 입력하여 새 프로젝트를 생성합니다.

2단계: activity_main.xml 작성

res/layout/activity_main.xml 파일에 아래 코드를 추가합니다.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:app="https://schemas.android.com/apk/res-auto"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

3단계: MainActivity.java 작성

src/MainActivity.java에 다음 코드를 추가합니다. 일반 알림과 커스텀 알림을 각각 버튼으로 호출할 수 있도록 구현합니다.

package com.app.sample;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.NotificationCompat;
import android.os.Bundle;
import android.app.Activity;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.RemoteViews;
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.notificationmain);
        Button bnotify = (Button) findViewById(R.id.notification);
        Button bcustomnotify = (Button) findViewById(R.id.customnotification);
        bnotify.setOnClickListener(new OnClickListener() {
            public void onClick(View arg0) {
                Notification();
            }
        });
        bcustomnotify.setOnClickListener(new OnClickListener() {
            public void onClick(View arg0) {
                CustomNotification();
            }
        });
    }
    public void Notification() {
        // 알림 제목 설정
        String strtitle = getString(R.string.notificationtitle);
        String strtext = getString(R.string.notificationtext);
        Intent intent = new Intent(this, NotificationView.class);
        intent.putExtra("title", strtitle);
        intent.putExtra("text", strtext);
        PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
            .setSmallIcon(R.drawable.logosmall)
            .setTicker(getString(R.string.notificationticker))
            .setContentTitle(getString(R.string.notificationtitle))
            .setContentText(getString(R.string.notificationtext))
            .addAction(R.drawable.ic_launcher, "Action Button", pIntent)
            .setContentIntent(pIntent)
            .setAutoCancel(true);
        NotificationManager notificationmanager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        notificationmanager.notify(0, builder.build());
    }
    public void CustomNotification() {
        RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.customnotification);
        String strtitle = getString(R.string.customnotificationtitle);
        String strtext = getString(R.string.customnotificationtext);
        Intent intent = new Intent(this, NotificationView.class);
        intent.putExtra("title", strtitle);
        intent.putExtra("text", strtext);
        PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
            .setSmallIcon(R.drawable.logosmall)
            .setTicker(getString(R.string.customnotificationticker))
            .setAutoCancel(true)
            .setContentIntent(pIntent)
            .setContent(remoteViews);
        remoteViews.setImageViewResource(R.id.imagenotileft, R.drawable.ic_launcher);
        remoteViews.setImageViewResource(R.id.imagenotiright, R.drawable.androidhappy);
        remoteViews.setTextViewText(R.id.title, getString(R.string.customnotificationtitle));
        remoteViews.setTextViewText(R.id.text, getString(R.string.customnotificationtext));
        // Notification Manager 생성
        NotificationManager notificationmanager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        // Notification Manager로 알림 빌드
        notificationmanager.notify(0, builder.build());
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}

4단계: notification.xml 작성

res/layout/notification.xml에 아래 코드를 추가합니다. 화면 중앙에 두 개의 버튼을 배치합니다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
        android:id="@+id/notification"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Notification - 1" />
    <Button
        android:id="@+id/customnotification"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:layout_below="@+id/notification"
        android:text="Custom Notification - 1" />
</RelativeLayout>

5단계: customnotification.xml 작성

커스텀 알림의 외형을 결정하는 res/layout/customnotification.xml입니다. 좌측 이미지, 제목, 본문 텍스트, 우측 이미지로 구성됩니다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
        android:id="@+id/imagenotileft"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/imagenotileft" />
    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/title"
        android:layout_toRightOf="@+id/imagenotileft" />
    <ImageView
        android:id="@+id/imagenotiright"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:padding="10dp" />
</RelativeLayout>

6단계: notificationview.xml 작성

알림을 탭했을 때 열리는 상세 화면용 레이아웃입니다. res/layout/notificationview.xml에 추가합니다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView
        android:id="@+id/lbltitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/lbltitle" />
    <TextView
        android:id="@+id/lbltext"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/lbltitle"
        android:text="@string/lbltext" />
    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/lbltitle" />
    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/title"
        android:layout_toRightOf="@+id/lbltext" />
</RelativeLayout>

7단계: AndroidManifest.xml 수정

Manifests/AndroidManifest.xml에 아래 코드를 추가하거나 확인합니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android" package="com.app.sample">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

앱 실행 및 결과 확인

이제 애플리케이션을 실행해 보겠습니다. 실제 Android 스마트폰을 컴퓨터에 연결한 상태라고 가정합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤, 툴바의 Run 아이콘을 클릭하세요. 실행 옵션에서 자신의 모바일 기기를 선택하면, 기기 화면에 아래와 같은 기본 화면이 표시됩니다.

Android에서 커스텀 알림 레이아웃과 텍스트 색상을 만드는 방법

참고 사항

Android 8.0(API 26) 이상을 대상으로 하는 경우, 알림이 정상적으로 표시되려면 반드시 NotificationChannel을 먼저 생성하고 Builder에 채널 ID를 지정해야 합니다. 또한 커스텀 레이아웃 내 TextView의 색상은 setTextViewText()와 함께 setTextColor()를 사용하거나 XML에서 android:textColor 속성으로 지정할 수 있습니다. 시스템 알림 영역의 가독성을 위해 밝은 배경과 어두운 배경 모두에서 잘 보이는 색상 조합을 권장합니다.