
Котлинн2
.docxГУАП
КАФЕДРА № 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()
}
}