Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Кашина_РМП_ЛБ14_3

.docx
Скачиваний:
0
Добавлен:
22.09.2026
Размер:
222 Кб
Скачать
☆

Министерство науки и высшего образования Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего образования

«Владимирский государственный университет

имени Александра Григорьевича и Николая Григорьевича Столетовых» (ВлГУ)

Колледж инновационных технологий и предпринимательства

КАФЕДРА ФИЗИКИ И ПРИКЛАДНОЙ МАТЕМАТИКИ

Лабораторная работа № 14_3

по МДК 01.03 «Разработка мобильных приложений»

на тему: «Навигационное bottom меню в Андроид»

Выполнил

студент группы ИПсп-123

Кашина Д. А.

Принял

Красильщикова В.В.

Владимир, 2026 г.

Цель работы: научиться создавать навигационное bottom меню в среде разработки Android Studio.

Ход работы:

HomeFragment.java

package com.example.laba14_3;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import androidx.fragment.app.Fragment;

public class HomeFragment extends Fragment {

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

View view = inflater.inflate(R.layout.fragment_home, container, false);

return view;

}

}

HomeViewModel.java

package com.example.laba14_3.ui.home;

import androidx.lifecycle.LiveData;

import androidx.lifecycle.MutableLiveData;

import androidx.lifecycle.ViewModel;

public class HomeViewModel extends ViewModel {

private final MutableLiveData<String> mText;

public HomeViewModel() {

mText = new MutableLiveData<>();

mText.setValue("This is home fragment");

}

public LiveData<String> getText() {

return mText;

}

}

PhotoAdapter.java

package com.example.laba14_3.ui;

import android.net.Uri;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.ImageView;

import androidx.annotation.NonNull;

import androidx.recyclerview.widget.RecyclerView;

import com.example.laba14_3.R;

import java.util.List;

class PhotoAdapter extends RecyclerView.Adapter<PhotoAdapter.PhotoViewHolder> {

private final List<String> photoPaths;

public PhotoAdapter(List<String> photoPaths) {

this.photoPaths = photoPaths;

}

@NonNull

@Override

public PhotoViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

View view = LayoutInflater.from(parent.getContext())

.inflate(R.layout.item_photo, parent, false);

return new PhotoViewHolder(view);

}

@Override

public void onBindViewHolder(@NonNull PhotoViewHolder holder, int position) {

String path = photoPaths.get(position);

holder.imageView.setImageURI(Uri.parse(path));

}

@Override

public int getItemCount() {

return photoPaths.size();

}

static class PhotoViewHolder extends RecyclerView.ViewHolder {

ImageView imageView;

PhotoViewHolder(@NonNull View itemView) {

super(itemView);

imageView = itemView.findViewById(R.id.iv_photo);

}

}

}

CalendarFragment.java

package com.example.laba14_3;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import androidx.annotation.NonNull;

import androidx.fragment.app.Fragment;

import com.example.laba14_3.R;

public class CalendarFragment extends Fragment {

public View onCreateView(@NonNull LayoutInflater inflater,

ViewGroup container, Bundle savedInstanceState) {

return inflater.inflate(R.layout.fragment_calendar, container, false);

}

}

CameraFragment.java

package com.example.laba14_3;

import android.content.Intent;

import android.graphics.Bitmap;

import android.os.Bundle;

import android.provider.MediaStore;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.Toast;

import androidx.activity.result.ActivityResultLauncher;

import androidx.activity.result.contract.ActivityResultContracts;

import androidx.annotation.NonNull;

import androidx.fragment.app.Fragment;

import androidx.lifecycle.ViewModelProvider;

import com.example.laba14_3.databinding.FragmentCameraBinding;

public class CameraFragment extends Fragment {

private FragmentCameraBinding binding;

private GalleryViewModel galleryViewModel;

private final ActivityResultLauncher<Intent> cameraLauncher = registerForActivityResult(

new ActivityResultContracts.StartActivityForResult(),

result -> {

if (result.getResultCode() == android.app.Activity.RESULT_OK && result.getData() != null) {

Bundle extras = result.getData().getExtras();

Bitmap imageBitmap = (Bitmap) extras.get("data");

galleryViewModel.addPhoto(imageBitmap);

}

}

);

public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

binding = FragmentCameraBinding.inflate(inflater, container, false);

galleryViewModel = new ViewModelProvider(requireActivity()).get(GalleryViewModel.class);

binding.buttonTakePhoto.setOnClickListener(v -> {

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

if (takePictureIntent.resolveActivity(getActivity().getPackageManager()) != null) {

cameraLauncher.launch(takePictureIntent);

} else {

Toast.makeText(getContext(), "Камера не найдена", Toast.LENGTH_SHORT).show();

}

});

return binding.getRoot();

}

}

GalleryFragment.java

package com.example.laba14_3;

import android.graphics.Bitmap;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.ImageView;

import androidx.annotation.NonNull;

import androidx.fragment.app.Fragment;

import androidx.lifecycle.ViewModelProvider;

import androidx.recyclerview.widget.GridLayoutManager;

import androidx.recyclerview.widget.RecyclerView;

import com.example.laba14_3.R;

import com.example.laba14_3.databinding.FragmentGalleryBinding;

import java.util.List;

public class GalleryFragment extends Fragment {

private FragmentGalleryBinding binding;

public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

binding = FragmentGalleryBinding.inflate(inflater, container, false);

GalleryViewModel galleryViewModel = new ViewModelProvider(requireActivity()).get(GalleryViewModel.class);

binding.recyclerViewGallery.setLayoutManager(new GridLayoutManager(getContext(), 2));

galleryViewModel.getPhotos().observe(getViewLifecycleOwner(), photos -> {

if (photos != null) {

binding.recyclerViewGallery.setAdapter(new PhotoAdapter(photos));

}

});

return binding.getRoot();

}

@Override

public void onDestroyView() {

super.onDestroyView();

binding = null;

}

private static class PhotoAdapter extends RecyclerView.Adapter<PhotoAdapter.ViewHolder> {

private final List<Bitmap> photos;

public PhotoAdapter(List<Bitmap> photos) { this.photos = photos; }

@NonNull

@Override

public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_photo, parent, false);

return new ViewHolder(view);

}

@Override

public void onBindViewHolder(@NonNull ViewHolder holder, int position) {

holder.imageView.setImageBitmap(photos.get(position));

}

@Override

public int getItemCount() { return photos.size(); }

public static class ViewHolder extends RecyclerView.ViewHolder {

ImageView imageView;

public ViewHolder(View v) { super(v); imageView = v.findViewById(R.id.itemImageView); }

}

}

}

GalleryViewModel.java

package com.example.laba14_3;

import android.graphics.Bitmap;

import androidx.lifecycle.LiveData;

import androidx.lifecycle.MutableLiveData;

import androidx.lifecycle.ViewModel;

import java.util.ArrayList;

import java.util.List;

public class GalleryViewModel extends ViewModel {

private final MutableLiveData<List<Bitmap>> photos = new MutableLiveData<>(new ArrayList<>());

public LiveData<List<Bitmap>> getPhotos() {

return photos;

}

public void addPhoto(Bitmap bitmap) {

List<Bitmap> currentPhotos = photos.getValue();

if (currentPhotos != null) {

currentPhotos.add(0, bitmap);

photos.setValue(currentPhotos);

}

}

}

HomeFragment.java

package com.example.laba14_3;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import androidx.fragment.app.Fragment;

public class HomeFragment extends Fragment {

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

View view = inflater.inflate(R.layout.fragment_home, container, false);

return view;

}

}

MainActivity.java

package com.example.laba14_3;

import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;

import androidx.navigation.NavController;

import androidx.navigation.Navigation;

import androidx.navigation.ui.AppBarConfiguration;

import androidx.navigation.ui.NavigationUI;

import com.google.android.material.bottomnavigation.BottomNavigationView;

public class MainActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

BottomNavigationView navView = findViewById(R.id.nav_view);

AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(

R.id.navigation_home, R.id.navigation_playlist, R.id.navigation_camera,

R.id.navigation_gallery, R.id.navigation_calendar).build();

NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);

NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);

NavigationUI.setupWithNavController(navView, navController);

}

}

PhotoStore.java

package com.example.laba14_3;

import java.util.ArrayList;

import java.util.List;

public class PhotoStore {

private static PhotoStore instance;

private final List<String> photoPaths = new ArrayList<>();

private PhotoStore() {}

public static PhotoStore getInstance() {

if (instance == null) instance = new PhotoStore();

return instance;

}

public void addPhoto(String path) {

photoPaths.add(path);

}

public List<String> getPhotos() {

return photoPaths;

}

}

PlaylistFragment.java

package com.example.laba14_3;

import android.media.MediaPlayer;

import android.os.Bundle;

import android.os.Handler;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.Button;

import android.widget.SeekBar;

import android.widget.TextView;

import androidx.fragment.app.Fragment;

import com.example.laba14_3.R;

public class PlaylistFragment extends Fragment {

private MediaPlayer mediaPlayer;

private Button btnPlayPause, btnPrev, btnNext;

private SeekBar seekBar;

private TextView tvTime, tvStudent;

private Handler handler = new Handler();

private Runnable runnable;

private boolean isPlaying = false;

private int currentTrack = 0;

private int[] tracks = {R.raw.track1, R.raw.track2};

private String[] trackNames = {"Трек 1", "Трек 2", "Трек 3"};

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

View view = inflater.inflate(R.layout.fragment_playlist, container, false);

btnPlayPause = view.findViewById(R.id.btnPlayPause);

btnPrev = view.findViewById(R.id.btnPrev);

btnNext = view.findViewById(R.id.btnNext);

seekBar = view.findViewById(R.id.seekBar);

tvTime = view.findViewById(R.id.tvTime);

tvStudent = view.findViewById(R.id.tvStudent);

tvStudent.setText("Кашина Д.А.");

mediaPlayer = MediaPlayer.create(getContext(), tracks[currentTrack]);

seekBar.setMax(mediaPlayer.getDuration());

btnPlayPause.setOnClickListener(v -> {

if (isPlaying) {

pauseMusic();

} else {

playMusic();

}

});

btnPrev.setOnClickListener(v -> playPrev());

btnNext.setOnClickListener(v -> playNext());

seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {

@Override

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

if (fromUser) mediaPlayer.seekTo(progress);

}

@Override

public void onStartTrackingTouch(SeekBar seekBar) {}

@Override

public void onStopTrackingTouch(SeekBar seekBar) {}

});

return view;

}

private void playMusic() {

mediaPlayer.start();

isPlaying = true;

btnPlayPause.setText("⏸️");

updateSeekBar();

}

private void pauseMusic() {

mediaPlayer.pause();

isPlaying = false;

btnPlayPause.setText("▶️");

handler.removeCallbacks(runnable);

}

private void playPrev() {

if (currentTrack > 0) currentTrack--;

else currentTrack = tracks.length - 1;

changeTrack();

}

private void playNext() {

if (currentTrack < tracks.length - 1) currentTrack++;

else currentTrack = 0;

changeTrack();

}

private void changeTrack() {

mediaPlayer.release();

mediaPlayer = MediaPlayer.create(getContext(), tracks[currentTrack]);

seekBar.setMax(mediaPlayer.getDuration());

if (isPlaying) {

mediaPlayer.start();

updateSeekBar();

}

}

private void updateSeekBar() {

runnable = new Runnable() {

@Override

public void run() {

if (mediaPlayer != null && isPlaying) {

seekBar.setProgress(mediaPlayer.getCurrentPosition());

int minutes = (mediaPlayer.getCurrentPosition() / 1000) / 60;

int seconds = (mediaPlayer.getCurrentPosition() / 1000) % 60;

tvTime.setText(String.format("%02d:%02d", minutes, seconds));

handler.postDelayed(this, 1000);

}

}

};

handler.postDelayed(runnable, 1000);

}

@Override

public void onDestroy() {

super.onDestroy();

if (mediaPlayer != null) {

mediaPlayer.release();

mediaPlayer = null;

}

handler.removeCallbacks(runnable);

}

}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:app="http://schemas.android.com/apk/res-auto"

android:layout_width="match_parent"

android:layout_height="match_parent">

<androidx.appcompat.widget.Toolbar

android:id="@+id/toolbar"

android:layout_width="match_parent"

android:layout_height="?attr/actionBarSize"

android:background="#6200EE"

app:title="Bottom Nav"

app:titleTextColor="#FFFFFF"

app:layout_constraintTop_toTopOf="parent"/>

<fragment

android:id="@+id/nav_host_fragment"

android:name="androidx.navigation.fragment.NavHostFragment"

android:layout_width="match_parent"

android:layout_height="0dp"

app:layout_constraintBottom_toTopOf="@+id/nav_view"

app:layout_constraintTop_toBottomOf="@+id/toolbar"

app:defaultNavHost="true"

app:navGraph="@navigation/nav_graph" />

<com.google.android.material.bottomnavigation.BottomNavigationView

android:id="@+id/nav_view"

android:layout_width="0dp"

android:layout_height="wrap_content"

app:layout_constraintBottom_toBottomOf="parent"

app:layout_constraintLeft_toLeftOf="parent"

app:layout_constraintRight_toRightOf="parent"

app:menu="@menu/bottom_nav_menu" />

</androidx.constraintlayout.widget.ConstraintLayout>

fragment_calendar.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

android:gravity="center_horizontal"

android:padding="16dp">

<TextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Календарь событий"

android:textSize="20sp" />

<CalendarView

android:id="@+id/calendarView"

android:layout_width="match_parent"

android:layout_height="wrap_content" />

</LinearLayout>

fragment_camera.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout

xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="#E8F5E9"

android:gravity="center"

android:orientation="vertical"

android:padding="16dp">

<TextView

android:id="@+id/text_camera"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Камера"

android:textSize="20sp"

android:textColor="#2E7D32"

android:textStyle="bold" />

<ImageView

android:id="@+id/image_camera"

android:layout_width="200dp"

android:layout_height="200dp"

android:layout_marginTop="30dp"

android:src="@android:drawable/ic_menu_camera"/>

<Button

android:id="@+id/button_take_photo"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginTop="20dp"

android:text="Сделать фото"

android:backgroundTint="#4CAF50" />

</LinearLayout>

fragment_gallery.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout

xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:app="http://schemas.android.com/apk/res-auto"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

android:padding="8dp">

<TextView

android:id="@+id/gallery_title"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center_horizontal"

android:layout_marginTop="8dp"

android:layout_marginBottom="16dp"

android:text="Моя Галерея"

android:textColor="#333333"

android:textSize="22sp"

android:textStyle="bold" />

<androidx.recyclerview.widget.RecyclerView

android:id="@+id/recyclerViewGallery"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:clipToPadding="false"

android:scrollbars="vertical"

app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"

app:spanCount="3" />

</LinearLayout>

fragment_home.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://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">

<ImageView

android:layout_width="150dp"

android:layout_height="150dp"

android:src="@drawable/img3"

android:contentDescription="Лого"/>

<TextView

android:id="@+id/text_home"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Главная"

android:textSize="24sp"

android:textStyle="bold"

android:layout_marginTop="16dp"/>

<TextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Выполнила: Кашина Д.А."

android:textSize="18sp"

android:textColor="#6200EE"

android:layout_marginTop="32dp"/>

</LinearLayout>

fragment_playlist.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

android:padding="20dp"

android:gravity="center">

<TextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="🎵 Плейлист"

android:textSize="28sp"

android:textStyle="bold"

android:layout_marginBottom="30dp"/>

<SeekBar

android:id="@+id/seekBar"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_marginBottom="10dp"/>

<TextView

android:id="@+id/tvTime"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="00:00"

android:textSize="16sp"

android:layout_marginBottom="20dp"/>

<LinearLayout

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:orientation="horizontal">

<Button

android:id="@+id/btnPrev"

android:layout_width="60dp"

android:layout_height="60dp"

android:text="⏮️"

android:textSize="24sp"/>

<Button

android:id="@+id/btnPlayPause"

android:layout_width="80dp"

android:layout_height="80dp"

android:text="▶️"

android:textSize="32sp"

android:layout_marginHorizontal="20dp"/>

<Button

android:id="@+id/btnNext"

android:layout_width="60dp"

android:layout_height="60dp"

android:text="⏭️"

android:textSize="24sp"/>

</LinearLayout>

<TextView

android:id="@+id/tvStudent"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:textSize="18sp"

android:textColor="#6200EE"

android:layout_marginTop="30dp"/>

</LinearLayout>

item_photo.xml

<?xml version="1.0" encoding="utf-8"?>

<androidx.cardview.widget.CardView

xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_margin="6dp"

app:cardCornerRadius="16dp"

app:cardElevation="6dp">

<androidx.constraintlayout.widget.ConstraintLayout

android:layout_width="match_parent"

android:layout_height="wrap_content">

<ImageView

android:id="@+id/itemImageView"

android:layout_width="0dp"

android:layout_height="0dp"

android:scaleType="centerCrop"

android:src="@android:drawable/ic_menu_gallery"

app:layout_constraintDimensionRatio="1:1"

app:layout_constraintBottom_toBottomOf="parent"

app:layout_constraintEnd_toEndOf="parent"

app:layout_constraintStart_toStartOf="parent"

app:layout_constraintTop_toTopOf="parent" />

<View

android:layout_width="395dp"

android:layout_height="62dp"

android:background="#99000000"

app:layout_constraintBottom_toBottomOf="parent"

app:layout_constraintEnd_toEndOf="parent"

app:layout_constraintStart_toStartOf="parent" />

<RatingBar

android:id="@+id/itemRatingBar"

style="?android:attr/ratingBarStyle"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:numStars="4"

android:rating="3.0"

android:stepSize="1.0"

android:isIndicator="false"

android:progressTint="#FFD700"

android:scaleX="0.6"

android:scaleY="0.6"

android:transformPivotX="0dp"

android:transformPivotY="24dp"

app:layout_constraintBottom_toBottomOf="parent"

app:layout_constraintStart_toStartOf="parent"

android:layout_marginStart="8dp"

android:layout_marginBottom="0dp"/>

</androidx.constraintlayout.widget.ConstraintLayout>

</androidx.cardview.widget.CardView>

bottom_nav_menu.xml

<?xml version="1.0" encoding="utf-8"?>

<menu xmlns:android="http://schemas.android.com/apk/res/android">

<item

android:id="@+id/navigation_home"

android:icon="@android:drawable/ic_menu_compass"

android:title="Главная" />

<item

android:id="@+id/navigation_playlist"

android:icon="@android:drawable/ic_media_play"

android:title="Плейлист" />

<item

android:id="@+id/navigation_camera"

android:icon="@android:drawable/ic_menu_camera"

android:title="Камера" />

<item

android:id="@+id/navigation_gallery"

android:icon="@android:drawable/ic_menu_gallery"

android:title="Галерея" />

<item

android:id="@+id/navigation_calendar"

android:icon="@android:drawable/ic_menu_today"

android:title="Календарь" />

</menu>

nav_graph.xml

<?xml version="1.0" encoding="utf-8"?>

<navigation xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:app="http://schemas.android.com/apk/res-auto"

android:id="@+id/nav_graph"

app:startDestination="@id/navigation_home">

<fragment

android:id="@+id/navigation_home"

android:name="com.example.laba14_3.HomeFragment"

android:label="Главная" />

<fragment

android:id="@+id/navigation_playlist"

android:name="com.example.laba14_3.PlaylistFragment"

android:label="Плейлист" />

<fragment

android:id="@+id/navigation_camera"

android:name="com.example.laba14_3.CameraFragment"

android:label="Камера" />

<fragment

android:id="@+id/navigation_gallery"

android:name="com.example.laba14_3.GalleryFragment"

android:label="Галерея" />

<fragment

android:id="@+id/navigation_calendar"

android:name="com.example.laba14_3.CalendarFragment"

android:label="Календарь" />

</navigation>

file_paths.xml

<?xml version="1.0" encoding="utf-8"?>

<paths>

<files-path

name="my_photos"

path="photos/" />

<!-- Для внешнего хранилища (если понадобится) -->

<external-files-path

name="external_photos"

path="Pictures/" />

<!-- Для кэша (если понадобится) -->

<cache-path

name="cache_photos"

path="/" />

</paths>

Результат работы программы

Вывод: в ходе лабораторной работы были получены навыки создания навигационного bottom меню в среде разработки Android Studio.