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

Котлинн2

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

ГУАП

КАФЕДРА № 42

ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ

ПРЕПОДАВАТЕЛЬ

Доцент, канд. техн. наук

В.А. Ушаков

должность, уч. степень, звание

подпись, дата

инициалы, фамилия

ОТЧЕТ О ПРАКТИЧЕСКОЙ РАБОТЕ №2

по курсу:

Разработка мобильных приложений. Разработка мобильных приложений на Kotlin

РАБОТУ ВЫПОЛНИЛ

СТУДЕНТ гр. №

4116

подпись, дата

инициалы, фамилия

Санкт-Петербург 2024

Цель работы: выполнить проектирование и разработку мобильного приложения под ОС Android на языке программирования высокого уровня Kotlin.

Ход работы:

Вариант 10: Класс «Таксопарк»

В проект, созданный в прошлой практической работе добавлена новая активность: Bottom Navigation Views Activity с нижней навигационной панелью (Рисунок 1).

Рисунок 1­ –Добавление Bottom Navigation Views Activity

Добавлены файлы ресурсов цветов, строк и тем для визуализации предметной области проекта.

При открытии приложения открывается страница для входа в приложение с помощью виджета Button и функции OpenApp() (Рисунок 2).

Рисунок 2­ – Первая страница приложения

Добавлены новые активности Empty Views Activity (Рисунок 3) между которыми будет осуществляться переход c помощью файлов ресурсов навигации и кнопок, затем добавлена активность Basic Views Activity (Рисунок 7), Navigation Drawer Views Activity ( Рисунок 11).

Рисунок 3- Список Activity

На активности добавлены элементы, отражающие тему таксопарка и оформлен дизайн. На главной странице добавлено изображение, текст и галерея, которая пролистывается вправо (Рисунок 4).

Рисунок 4- Главная страница приложения

С помощью параметра orientation="horizontal" и orientation="vertical"> добавлены макеты горизонтальной и вертикальной ориентации, также на некоторые страницы добавлен тег ScrollView, который прокручивает экран вниз, для удобства использования приложения (Рисунок 5-10).

Рисунок 5 – Страница заказа такси в вертикальном положении

Рисунок 6– Страница заказа такси в горизонтальном положении

При нажатии кнопки «Заказать такси» открывается Basic Views Activity, которая включает в себя переключение между экранами с помощью компонента навигации (Рисунок 7-8)

Рисунок 7- Basic Views Activity

Рисунок 8- Переключение экранов Basic Views Activity

Рисунок 9– Страница уведомлений

Рисунок 10 – Страница Профиля

Также в приложении можно сделать боковое выдвижное меню с помощью активности Navigation Drawer Views Activity (Рисунок 11)

Рисунок 11- Navigation Drawer Views Activity

Вывод: в ходе выполнения практической работы дополнен проект из 1 практической работы. Добавлены новые Activity с изображениями, кнопками и текстом. Реализованы переходы между Activity.

ПРИЛОЖЕНИЕ

Листинг AppActivity.kt

package com.example.myapplication

import android.content.Intent

import android.os.Bundle

import android.view.View

import androidx.appcompat.app.AppCompatActivity

class AppActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_app)

}

fun openApp(view: View?) {

startActivity(Intent(this, TaxiActivity::class.java))

}

}

Листинг activity_app.xml

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

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

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

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

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="@color/light_yellow"

tools:context=".AppActivity">

<ImageView

android:layout_width="401dp"

android:layout_height="280dp"

android:adjustViewBounds="true"

android:gravity="center"

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

<Button

android:layout_width="239dp"

android:layout_height="81dp"

android:layout_centerInParent="true"

android:layout_marginTop="10dp"

android:layout_marginBottom="-71dp"

android:background="@color/black"

android:gravity="center"

android:onClick="openApp"

android:text="Открыть приложение"

android:textColor="@color/light_yellow"

android:textSize="25dp" />

</RelativeLayout>

Листинг CarFragment.kt

package com.example.myapplication

import android.os.Bundle

import androidx.fragment.app.Fragment

import android.view.LayoutInflater

import android.view.View

import android.view.ViewGroup

class CarFragment : Fragment() {

override fun onCreateView(

inflater: LayoutInflater, container: ViewGroup?,

savedInstanceState: Bundle?

): View? {

return inflater.inflate(R.layout.activity_home, container, false)

}

}

Листинг activity_home.xml

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

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

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

android:layout_width="match_parent"

android:layout_height="match_parent"

android:fillViewport="true"

tools:context=".OrderFragment">

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

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

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:orientation="vertical"

android:padding="16dp"

android:background="@color/light_yellow"

tools:context=".CarFragment">

<ImageView

android:layout_width="389dp"

android:layout_height="128dp"

android:adjustViewBounds="true"

android:gravity="center"

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

<TextView

android:id="@+id/taxi"

android:layout_width="392dp"

android:layout_height="236dp"

android:background="@color/light_yellow"

android:gravity="center"

android:lineSpacingExtra="8dp"

android:padding="16dp"

android:text="@string/welcome_message"

android:textColor="#000000"

android:textSize="17sp" />

<HorizontalScrollView

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:paddingTop="8dp">

<LinearLayout

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:orientation="horizontal">

<ImageView

android:layout_width="291dp"

android:layout_height="200dp"

android:layout_marginEnd="8dp"

android:scaleType="centerCrop"

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

<ImageView

android:layout_width="262dp"

android:layout_height="200dp"

android:layout_marginEnd="8dp"

android:scaleType="centerCrop"

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

<ImageView

android:layout_width="292dp"

android:layout_height="200dp"

android:scaleType="centerCrop"

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

</LinearLayout>

</HorizontalScrollView>

</LinearLayout>

</ScrollView>

Листинг NothificationsFragment.kt

package com.example.myapplication

import android.os.Bundle

import androidx.fragment.app.Fragment

import android.view.LayoutInflater

import android.view.View

import android.view.ViewGroup

class NothificationsFragment : Fragment() {

override fun onCreateView(

inflater: LayoutInflater, container: ViewGroup?,

savedInstanceState: Bundle?

): View? {

// Inflate the layout for this fragment

return inflater.inflate(R.layout.activity_nothifications_fragment, container, false)

}

}

Листинг activity_nothifications_fragment.xml

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

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

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

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context=".NothificationsFragment"

android:background="@color/light_yellow"

android:paddingTop="0dp">

<TextView

android:id="@+id/taxi"

android:layout_width="match_parent"

android:layout_height="606dp"

android:background="@color/light_yellow"

android:gravity="center"

android:lineSpacingExtra="8dp"

android:padding="16dp"

android:text="Нет новых уведомлений"

android:textColor="@color/black"

android:textSize="30sp" />

</RelativeLayout>

Листинг OrderFragment.kt

package com.example.myapplication

import android.content.Intent

import android.os.Bundle

import androidx.fragment.app.Fragment

import android.view.LayoutInflater

import android.view.View

import android.view.ViewGroup

class OrderFragment : Fragment() {

override fun onCreateView(

inflater: LayoutInflater, container: ViewGroup?,

savedInstanceState: Bundle?

): View? {

// Inflate the layout for this fragment

val view = inflater.inflate(R.layout.activity_order, container, false)

val buttonOrder = view.findViewById<View>(R.id.buttonOrder)

buttonOrder.setOnClickListener {

openOrder()

}

return view

}

private fun openOrder() {

val intent = Intent(requireActivity(), Main2::class.java)

startActivity(intent)

}

}

Листинг activity_order.xml

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

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

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

android:layout_width="match_parent"

android:layout_height="match_parent"

android:fillViewport="true"

tools:context=".OrderFragment">

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

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

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="horizontal"

tools:context=".OrderFragment"

android:background="@color/light_yellow"

android:paddingTop="0dp">

<Button

android:id="@+id/buttonChange"

android:layout_width="318dp"

android:layout_height="96dp"

android:layout_below="@id/imageViewProfile"

android:layout_centerHorizontal="true"

android:layout_marginTop="104dp"

android:text="Заказать Такси"

android:textColor="@color/light_yellow" />

<ImageView

android:id="@+id/imageViewProfile"

android:layout_width="360dp"

android:layout_height="293dp"

android:layout_centerHorizontal="true"

android:layout_marginTop="82dp"

android:scaleType="centerCrop"

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

</RelativeLayout>

</ScrollView>

Листинг ProfileFragment.kt

package com.example.myapplication

import android.os.Bundle

import androidx.fragment.app.Fragment

import android.view.LayoutInflater

import android.view.View

import android.view.ViewGroup

class ProfileFragment : Fragment() {

override fun onCreateView(

inflater: LayoutInflater, container: ViewGroup?,

savedInstanceState: Bundle?

): View? {

// Inflate the layout for this fragment

return inflater.inflate(R.layout.activity_profile, container, false)

}

}

Листинг activity_profile.xml

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

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

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

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context=".ProfileFragment"

android:background="@color/light_yellow"

android:paddingTop="0dp">

<ImageView

android:id="@+id/imageViewProfile"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:scaleType="centerCrop"

android:src="@drawable/tax"

android:layout_marginTop="0dp" />

<Button

android:id="@+id/buttonChange"

android:layout_width="297dp"

android:layout_height="wrap_content"

android:layout_below="@id/imageViewProfile"

android:layout_centerHorizontal="true"

android:layout_marginTop="82dp"

android:text="Редактировать профиль"

android:textColor="@color/light_yellow" />

<Button

android:id="@+id/buttonChangeProfile"

android:layout_width="298dp"

android:layout_height="wrap_content"

android:layout_below="@id/buttonChange"

android:layout_centerHorizontal="true"

android:layout_marginTop="16dp"

android:text="Выйти из аккаунта"

android:textColor="@color/light_yellow" />

<ImageView

android:id="@+id/imageView"

android:layout_width="282dp"

android:layout_height="151dp"

android:layout_alignParentBottom="true"

android:layout_centerHorizontal="true"

android:layout_marginBottom="0dp"

android:src="@drawable/img"

/>

Листинг TaxiActivity.kt

package com.example.myapplication

import android.os.Bundle

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

import androidx.appcompat.app.AppCompatActivity

import androidx.navigation.findNavController

import androidx.navigation.ui.AppBarConfiguration

import androidx.navigation.ui.setupActionBarWithNavController

import androidx.navigation.ui.setupWithNavController

import com.example.myapplication.databinding.ActivityMainBinding

class TaxiActivity : AppCompatActivity() {

private lateinit var binding: ActivityMainBinding

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

binding = ActivityMainBinding.inflate(layoutInflater)

setContentView(binding.root)

val navView: BottomNavigationView = binding.navView

val navController = findNavController(R.id.nav_host_fragment_activity_main)

// Passing each menu ID as a set of Ids because each

// menu should be considered as top level destinations.

val appBarConfiguration = AppBarConfiguration(

setOf(

R.id.navigation_home, R.id.navigation_car, R.id.navigation_notifications, R.id.navigation_people

)

)

setupActionBarWithNavController(navController, appBarConfiguration)

navView.setupWithNavController(navController)

}

}

Листинг 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"

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

android:id="@+id/container"

android:layout_width="match_parent"

android:layout_height="match_parent">

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

android:id="@+id/nav_view"

android:layout_width="0dp"

android:layout_height="wrap_content"

android:layout_marginStart="0dp"

android:layout_marginEnd="0dp"

android:background="@color/light_yellow"

app:layout_constraintBottom_toBottomOf="parent"

app:layout_constraintLeft_toLeftOf="parent"

app:layout_constraintRight_toRightOf="parent"

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

<fragment

android:id="@+id/nav_host_fragment_activity_main"

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

android:layout_width="0dp"

android:layout_height="0dp"

app:defaultNavHost="true"

app:layout_constraintBottom_toTopOf="@id/nav_view"

app:layout_constraintLeft_toLeftOf="parent"

app:layout_constraintRight_toRightOf="parent"

app:layout_constraintTop_toTopOf="parent"

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

</androidx.constraintlayout.widget.ConstraintLayout>

Листинг mobile_navigation.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"

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

android:id="@+id/mobile_navigation"

app:startDestination="@+id/navigation_home">

<fragment

android:id="@+id/navigation_home"

android:name="com.example.myapplication.CarFragment"

android:label="@string/title_home"

tools:layout="@layout/activity_home" />

<fragment

android:id="@+id/navigation_car"

android:name="com.example.myapplication.OrderFragment"

android:label="@string/title_dashboard"

tools:layout="@layout/activity_home" />

<fragment

android:id="@+id/navigation_notifications"

android:name="com.example.myapplication.NothificationsFragment"

android:label="@string/title_notifications"

tools:layout="@layout/fragment_notifications" />

<fragment

android:id="@+id/navigation_people"

android:name="com.example.myapplication.ProfileFragment"

android:label="@string/title_person"

tools:layout="@layout/activity_profile" />

</navigation>

Листинг Main2.kt (Basic Views Activity)

package com.example.myapplication

import android.os.Bundle

import com.google.android.material.snackbar.Snackbar

import androidx.appcompat.app.AppCompatActivity

import androidx.navigation.findNavController

import androidx.navigation.ui.AppBarConfiguration

import androidx.navigation.ui.navigateUp

import androidx.navigation.ui.setupActionBarWithNavController

import com.example.myapplication.databinding.ActivityMain2Binding

class Main2 : AppCompatActivity() {

private lateinit var appBarConfiguration: AppBarConfiguration

private lateinit var binding: ActivityMain2Binding

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

binding = ActivityMain2Binding.inflate(layoutInflater)

setContentView(binding.root)

setSupportActionBar(binding.toolbar)

val navController = findNavController(R.id.nav_host_fragment_content_main2)

appBarConfiguration = AppBarConfiguration(navController.graph)

setupActionBarWithNavController(navController, appBarConfiguration)

binding.fab.setOnClickListener { view ->

Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)

.setAction("Action", null).show()

}

}

override fun onSupportNavigateUp(): Boolean {

val navController = findNavController(R.id.nav_host_fragment_content_main2)

return navController.navigateUp(appBarConfiguration)

|| super.onSupportNavigateUp()

}

}

Соседние файлы в предмете Разработка мобильных приложений