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

Android-এ NavigationView ব্যবহার করে নেভিগেশন ড্রয়ার তৈরির পদ্ধতি

Android-এ NavigationView ব্যবহার করে নেভিগেশন ড্রয়ার তৈরির পদ্ধতি

NavigationView (Material Design Komponente) হলো সাইড নেভিগেশন ড্রয়ার (Hamburger Menu) বাস্তবায়নের জন্য стандарт উপাদান। এটি DrawerLayout-এর সাথে কাজ করে এবং মেনু আইটেম, হেডার, এবং নেভিগেশন হ্যান্ডলিং সরল করে।

প্রয়োজনীয় ধাপসমূহ

ধাপ ১: নতুন প্রজেক্ট তৈরি করুন

Android Studio-তে File → New Project → Navigation Drawer Activity টেমপ্লেট বেছে নিন (এটি অটোমেটিক্যালি সব সেটআপ করে দেয়)। অথবা Empty Activity থেকে ম্যানুয়ালি তৈরি করুন।

ধাপ ২: ডিপেন্ডেন্সি নিশ্চিত করুন

dependencies {
    implementation 'com.google.android.material:material:1.11.0'
    implementation 'androidx.navigation:navigation-fragment:2.7.6'
    implementation 'androidx.navigation:navigation-ui:2.7.6'
}

ধাপ ৩: মেইন লেআউট (res/layout/activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout
    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:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">

    <!-- মূল কন্টেন্ট -->>
    <include
        layout="@layout/app_bar_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <!-- নেভিগেশন ড্রয়ার (NavigationView) -->>
    <com.google.android.material.navigation.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer" />

</androidx.drawerlayout.widget.DrawerLayout>

ধাপ ৪: অ্যাপ বার লেআউট (res/layout/app_bar_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
    xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:app="https://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.google.android.material.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/ThemeOverlay.MaterialComponents.Dark.ActionBar">

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/ThemeOverlay.MaterialComponents.Light" />

    </com.google.android.material.appbar.AppBarLayout>

    <!-- ফ্র্যাগমেন্ট কন্টেইনার (NavHostFragment) -->>
    <fragment
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:navGraph="@navigation/mobile_navigation"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="16dp"
        android:src="@android:drawable/ic_dialog_email" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

ধাপ ৫: নেভিগেশন হেডার (res/layout/nav_header_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="192dp"
    android:background="@drawable/side_nav_bar"
    android:gravity="bottom"
    android:orientation="vertical"
    android:padding="16dp"
    android:theme="@style/ThemeOverlay.MaterialComponents.Dark">

    <ImageView
        android:layout_width="56dp"
        android:layout_height="56dp"
        android:src="@mipmap/ic_launcher_round"
        android:contentDescription="প্রোফাইল ছবি" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:text="ব্যবহারকারীর নাম"
        android:textAppearance="@style/TextAppearance.MaterialComponents.Subtitle1" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="user@example.com" />

</LinearLayout>

ধাপ ৬: নেভিগেশন মেনু (res/menu/activity_main_drawer.xml)

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    tools:showIn="navigation_view">

    <group android:checkableBehavior="single">
        <item
            android:id="@+id/nav_home"
            android:icon="@drawable/ic_home"
            android:title="হোম" />
        <item
            android:id="@+id/nav_gallery"
            android:icon="@drawable/ic_gallery"
            android:title="গ্যালারি" />
        <item
            android:id="@+id/nav_slideshow"
            android:icon="@drawable/ic_slideshow"
            android:title="স্লাইডশো" />
        <item
            android:id="@+id/nav_tools"
            android:icon="@drawable/ic_tools"
            android:title="টুলস" />
        <item
            android:id="@+id/nav_share"
            android:icon="@drawable/ic_share"
            android:title="শেয়ার" />
        <item
            android:id="@+id/nav_send"
            android:icon="@drawable/ic_send"
            android:title="পাঠান" />
    </group>

    <item android:title="সেটিংস">
        <menu>
            <item
                android:id="@+id/nav_settings"
                android:icon="@drawable/ic_settings"
                android:title="সেটিংস" />
        </menu>
    </item>
</menu>

ধাপ ৭: নেভিগেশন গ্রাফ (res/navigation/mobile_navigation.xml)

<?xml version="1.0" encoding="utf-8"?>
<navigation 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:id="@+id/mobile_navigation"
    app:startDestination="@+id/nav_home">

    <fragment
        android:id="@+id/nav_home"
        android:name="app.com.sample.ui.home.HomeFragment"
        android:label="হোম"
        tools:layout="@layout/fragment_home" />

    <fragment
        android:id="@+id/nav_gallery"
        android:name="app.com.sample.ui.gallery.GalleryFragment"
        android:label="গ্যালারি"
        tools:layout="@layout/fragment_gallery" />

    <fragment
        android:id="@+id/nav_slideshow"
        android:name="app.com.sample.ui.slideshow.SlideshowFragment"
        android:label="স্লাইডশো"
        tools:layout="@layout/fragment_slideshow" />

    <fragment
        android:id="@+id/nav_tools"
        android:name="app.com.sample.ui.tools.ToolsFragment"
        android:label="টুলস"
        tools:layout="@layout/fragment_tools" />

    <fragment
        android:id="@+id/nav_share"
        android:name="app.com.sample.ui.share.ShareFragment"
        android:label="শেয়ার"
        tools:layout="@layout/fragment_share" />

    <fragment
        android:id="@+id/nav_send"
        android:name="app.com.sample.ui.send.SendFragment"
        android:label="পাঠান"
        tools:layout="@layout/fragment_send" />

</navigation>

ধাপ ৮: হোম ফ্র্যাগমেন্ট উদাহরণ (res/layout/fragment_home.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"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/text_home"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="16dp"
        android:text="হোম ফ্র্যাগমেন্টে স্বাগতম!"
        android:textAlignment="center"
        android:textSize="20sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

ধাপ ৯: HomeFragment.java

package app.com.sample.ui.home;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;

public class HomeFragment extends Fragment {

    private HomeViewModel homeViewModel;

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        homeViewModel = new ViewModelProvider(this).get(HomeViewModel.class);
        View root = inflater.inflate(R.layout.fragment_home, container, false);
        final TextView textView = root.findViewById(R.id.text_home);

        homeViewModel.getText().observe(getViewLifecycleOwner(), textView::setText);
        return root;
    }
}

ধাপ ১০: HomeViewModel.java

package app.com.sample.ui.home;

import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;

public class HomeViewModel extends ViewModel {

    private final MutableLiveData<String> text = new MutableLiveData<>();

    public HomeViewModel() {
        text.setValue("হোম ফ্র্যাগমেন্ট থেকে স্বাগতম! নেভিগেশন ড্রয়ার থেকে অন্য পেজ দেখুন।");
    }

    public LiveData<String> getText() {
        return text;
    }
}

ধাপ ১১: MainActivity.java (NavigationUI সেটআপ)

package app.com.sample;

import android.os.Bundle;
import android.view.MenuItem;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.navigation.NavigationView;
import com.google.android.material.snackbar.Snackbar;

public class MainActivity extends AppCompatActivity {

    private AppBarConfiguration mAppBarConfiguration;
    private DrawerLayout drawer;
    private NavigationView navigationView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        drawer = findViewById(R.id.drawer_layout);
        navigationView = findViewById(R.id.nav_view);

        // NavController পান
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);

        // AppBarConfiguration: কোন ডেস্টিনেশনগুলো "টপ-লেভেল" (হোম্বার্টন দেখাবে)
        mAppBarConfiguration = new AppBarConfiguration.Builder(
                R.id.nav_home, R.id.nav_gallery, R.id.nav_slideshow,
                R.id.nav_tools, R.id.nav_share, R.id.nav_send)
                .setOpenableLayout(drawer)
                .build();

        // Toolbar-এ NavigationUI সেটআপ (হ্যামবার্গার আইকন, টাইটেল আপডেট)
        NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);

        // NavigationView-এ NavigationUI সেটআপ (মেনু আইটেম ক্লিক হ্যান্ডলিং)
        NavigationUI.setupWithNavController(navigationView, navController);

        // FAB ক্লিক
        FloatingActionButton fab = findViewById(R.id.fab);
        fab.setOnClickListener(view -> Snackbar.make(view, "আপনার অ্যাকশন এখানে যোগ করুন", Snackbar.LENGTH_LONG)
                .setAction("Action", null).show());
    }

    @Override
    public boolean onSupportNavigateUp() {
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
        return NavigationUI.navigateUp(navController, mAppBarConfiguration) || super.onSupportNavigateUp();
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        // NavigationUI অটোমেটিক্যালি হ্যান্ডেল করে, কিন্তু কাস্টম লজিকের জন্য ওভাররাইড করা যায়
        return NavigationUI.onNavDestinationSelected(item, Navigation.findNavController(this, R.id.nav_host_fragment))
                || super.onOptionsItemSelected(item);
    }
}

ধাপ ১২: AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="app.com.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/Theme.MaterialComponents.DayNight.NoActionBar">

        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/Theme.MaterialComponents.DayNight.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
</manifest>

থিম এবং স্টাইল (res/values/themes.xml)

<resources>
    <!-- Base theme -->
    <style name="Theme.MaterialComponents.DayNight.NoActionBar" parent="Theme.MaterialComponents.DayNight.NoActionBar">
        <item name="colorPrimary">@color/purple_500</item>
        <item name="colorPrimaryVariant">@color/purple_700</item>
        <item name="colorOnPrimary">@color/white</item>
        <item name="colorSecondary">@color/teal_200</item>
        <item name="colorSecondaryVariant">@color/teal_700</item>
        <item name="colorOnSecondary">@color/black</item>
        <item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
    </style>

    <!-- Toolbar theme -->
    <style name="ThemeOverlay.MaterialComponents.Dark.ActionBar" parent="ThemeOverlay.MaterialComponents.Dark.ActionBar" />
    <style name="ThemeOverlay.MaterialComponents.Light" parent="ThemeOverlay.MaterialComponents.Light" />
</resources>

NavigationView কাস্টমাইজেশন

১. মেনু আইটেমের আইকন রঙ পরিবর্তন

// Java-এ
navigationView.setItemIconTintList(ColorStateList.valueOf(ContextCompat.getColor(this, R.color.custom_color)));

// XML-এ (app:itemIconTint="@color/custom_color")

২. মেনু আইটেমের টেক্সট রঙ/স্টাইল

// XML-এ
app:itemTextColor="@color/selector_text_color"
app:itemTextAppearance="@style/NavigationItemTextStyle"
app:itemBackground="@drawable/nav_item_background"

৩. হেডার ভিউতে ডাইনামিক ডেটা সেট

View headerView = navigationView.getHeaderView(0);
TextView nameTv = headerView.findViewById(R.id.nav_header_name);
TextView emailTv = headerView.findViewById(R.id.nav_header_email);
nameTv.setText(userName);
emailTv.setText(userEmail);

অ্যাপ্লিকেশন চালানোর পদ্ধতি

আপনার Android ডিভাইস কম্পিউটারের সাথে সংযুক্ত করুন। Android Studio-তে Run আইকনে ক্লিক করুন। অ্যাপ খুললে টুলবারের হ্যামবার্গার আইকনে ক্লিক করলে বা স্ক্রিনের বাম প্রান্ত থেকে ডান দিকে স্বাইপ করলে নেভিগেশন ড্রয়ার খুলবে।

Android-এ NavigationView ব্যবহার করে নেভিগেশন ড্রয়ার তৈরির পদ্ধতি

  1. অ্যান্ড্রয়েডে LocalBroadcastManager ব্যবহারের পদ্ধতি

  2. অ্যান্ড্রয়েডে Handler ব্যবহারের পদ্ধতি

  3. এন্ড্রয়েডে ViewFlipper ব্যবহার করার পদ্ধতি

  4. অ্যান্ড্রয়েডে Snackbar ব্যবহার করার পদ্ধতি