RemoteViews ব্যবহার করে কাস্টম নোটিফিকেশন ডিজাইন
এই টিউটোরিয়ালটি দেখাবে কীভাবে NotificationCompat.Builder এবং RemoteViews ব্যবহার করে সম্পূর্ণ কাস্টম লেআউট, কালার, ইমেজ সহ নোটিফিকেশন তৈরি করা যায়।
পদক্ষেপ ১: প্রজেক্ট তৈরি করুন
Android Studio-তে নতুন প্রজেক্ট শুরু করুন।
পদক্ষেপ ২: লেআউট XML ফাইলসমূহ
কাস্টম নোটিফিকেশন লেআউট (res/layout/custom_notification.xml)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp"
android:background="#FFFFFF">
<ImageView
android:id="@+id/imagenotileft"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:scaleType="centerCrop" />
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toEndOf="@id/imagenotileft"
android:layout_marginStart="12dp"
android:layout_marginTop="4dp"
android:text="Custom Title"
android:textColor="#000000"
android:textSize="16sp"
android:textStyle="bold" />
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toEndOf="@id/imagenotileft"
android:layout_below="@id/title"
android:layout_marginStart="12dp"
android:text="Custom notification message"
android:textColor="#666666"
android:textSize="14sp" />
<ImageView
android:id="@+id/imagenotiright"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:padding="4dp" />
</RelativeLayout>
মেইন অ্যাক্টিভিটি লেআউট (activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
android:padding="16dp">
<Button
android:id="@+id/btnStandard"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Show Standard Notification" />
<Button
android:id="@+id/btnCustom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="Show Custom Notification" />
</LinearLayout>
পদক্ষেপ ৩: MainActivity.java
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.RemoteViews;
public class MainActivity extends AppCompatActivity {
private static final String CHANNEL_ID = "custom_notification_channel";
private static final int NOTIFICATION_ID = 1001;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
createNotificationChannel();
Button btnStandard = findViewById(R.id.btnStandard);
Button btnCustom = findViewById(R.id.btnCustom);
btnStandard.setOnClickListener(v -> showStandardNotification());
btnCustom.setOnClickListener(v -> showCustomNotification());
}
private void createNotificationChannel() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(
CHANNEL_ID,
"Custom Notifications",
NotificationManager.IMPORTANCE_DEFAULT
);
channel.setDescription("Custom layout notifications");
NotificationManager manager = getSystemService(NotificationManager.class);
manager.createNotificationChannel(channel);
}
}
private void showStandardNotification() {
Intent intent = new Intent(this, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(
this, 0, intent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT
);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
.setSmallIcon(R.drawable.ic_launcher_foreground)
.setContentTitle("Standard Notification")
.setContentText("This is a standard notification with default layout")
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
.setContentIntent(pendingIntent)
.setAutoCancel(true);
NotificationManagerCompat.from(this).notify(NOTIFICATION_ID, builder.build());
}
private void showCustomNotification() {
// RemoteViews দিয়ে কাস্টম লেআউট বাইন্ড
RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.custom_notification);
remoteViews.setTextViewText(R.id.title, "Custom Title - Green Color");
remoteViews.setTextColor(R.id.title, Color.GREEN);
remoteViews.setTextViewText(R.id.text, "Custom message with red color");
remoteViews.setTextColor(R.id.text, Color.RED);
remoteViews.setImageViewResource(R.id.imagenotileft, R.drawable.ic_launcher_foreground);
remoteViews.setImageViewResource(R.id.imagenotiright, R.drawable.ic_launcher_background);
Intent intent = new Intent(this, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(
this, 0, intent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT
);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
.setSmallIcon(R.drawable.ic_launcher_foreground)
.setCustomContentView(remoteViews) // কাস্টম লেআউট
.setCustomBigContentView(remoteViews) // এক্সপ্যান্ডেড ভিউ (ঐচ্ছিক)
.setContentIntent(pendingIntent)
.setAutoCancel(true)
.setPriority(NotificationCompat.PRIORITY_DEFAULT);
NotificationManagerCompat.from(this).notify(NOTIFICATION_ID + 1, builder.build());
}
}
পদক্ষেপ ৪: AndroidManifest.xml
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> <!-- API 33+ -->
<application ...>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
গুরুত্বপূর্ণ পয়েন্টসমূহ
- RemoteViews সীমাবদ্ধতা: সব ভিউ/অ্যাট্রিবিউট সাপোর্ট করে না (সپسোর্টেড: TextView, ImageView, ProgressBar, Chronometer, AnalogClock, Button, ImageButton)
- CustomBigContentView: এক্সপ্যান্ডেড স্টেটের জন্য আলাদা লেআউট দিতে পারেন
- Notification Channel (API 26+): বাধ্যতামূলক, অন্যথায় নোটিফিকেশন দেখাবে না
- PendingIntent FLAG_IMMUTABLE: API 31+ এর জন্য বাধ্যতামূলক
- POST_NOTIFICATIONS পারমিশন: Android 13+ (API 33+) এ রানটাইম রিকোয়েস্ট করুন
NotificationCompat.DecoratedCustomViewStyle (API 24+)
হেডার (অ্যাপ নাম, টাইম, স্মল আইকন) রাখতে চাইলে:
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
.setSmallIcon(R.drawable.ic_launcher)
.setCustomContentView(remoteViews)
.setStyle(new NotificationCompat.DecoratedCustomViewStyle()); // হেডার+ফুটার থাকে