কম্পিউটার টিউটোরিয়াল

অ্যান্ড্রয়েডে কাস্টম নোটিফিকেশন লেআউট ও টেক্সট কালার তৈরি করা

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()); // হেডার+ফুটার থাকে
  1. অ্যান্ড্রয়েডে কাস্টম ডায়লগ বক্স তৈরি করার পদ্ধতি

  2. অ্যান্ড্রয়েডে পেজিনেটিং টেক্সট তৈরির পদ্ধতি

  3. অ্যান্ড্রয়েডে কাস্টম রেটিংবার (RatingBar) তৈরি করা

  4. অ্যান্ড্রয়েডে টেক্সট ফাইল তৈরি করে ডেটা লিখার পদ্ধতি