Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
add: Class
Приложение работает.
  • Loading branch information
aleh-god committed Jun 19, 2021
commit aee97409e80999916470d70fe6e08bddb538ab39
2 changes: 1 addition & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:label="Quiz"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Quiz.First">
Expand Down
9 changes: 9 additions & 0 deletions app/src/main/java/com/rsschool/quiz/ActionListener.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.rsschool.quiz

interface ActionListener {
fun currentFragment(): Int
fun nextFragment()
fun backFragment()
fun runResultActivity()
fun addAnswer(numberQuest: Int, numberAnswer: Int)
}
110 changes: 110 additions & 0 deletions app/src/main/java/com/rsschool/quiz/BlankFragment.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
package com.rsschool.quiz

import android.content.Context
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import com.rsschool.quiz.databinding.FragmentQuizBinding
import kotlin.properties.Delegates


// Вне тела класса создаем константу для ключа аргумента, который будем передавать в каждый новый экземпляр фрагмента.
const val ARG_OBJECT = "object"

// Этот фрагмент будет использоваться для каждого нового экрана в приложении, мы будем создавать новый его экземпляр и передавать туда его порядковый номер.
class BlankFragment : Fragment() {

private var listener: ActionListener? = null
private var _binding: FragmentQuizBinding? = null
private val binding get() = _binding!!

private var tempInt by Delegates.notNull<Int>()

// Добавляем слушатель через контекст
override fun onAttach(context: Context) {
super.onAttach(context)
listener = context as ActionListener
}

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {

// я просто создал массив R.style и загружал просто при каждом переключении
// context?.setTheme(id)

// цвет выдергивал в onCreateView до inflate. А цвет менял в методе viewPager.registerOnPageChangeCallback(object:ViewPager2.OnPageChangeCallback(){
// override fun onPageSelected(position: Int) {}}
//этот метод выполняется при смене страницы и в position передается номер страницы


// Если вы используете ViewBinding во фрагменте и держите ссылку на binding во фрагменте (а не только в методе onCreateView())
_binding = FragmentQuizBinding.inflate(inflater, container, false)
return binding.root
// return inflater.inflate(R.layout.fragment_blank, container, false)
}

// В переопределенном методе onViewCreated получаем аргумент, находим текстовое поле и передаем туда значение аргумента для отображения.
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

// Берем аргумент Bundle arguments, если он имеет ключ ARG_OBJECT и применяем лямбду
arguments?.takeIf { it.containsKey(ARG_OBJECT) }?.apply {

// Чтобы получить отправленные данные при загрузке из Bundle arguments, можно воспользоваться методом get(), в который передается ключ объекта:
val quizObject: QuizObject = get(ARG_OBJECT) as QuizObject

binding.toolbar.title = "Question ${quizObject.numberQuestion}"

// Общее для всех функций свойство класса
tempInt = quizObject.numberQuestion

binding.question.text = quizObject.question
binding.optionOne.text = quizObject.answers[0]
binding.optionTwo.text = quizObject.answers[1]
binding.optionThree.text = quizObject.answers[2]
binding.optionFour.text = quizObject.answers[3]
binding.optionFive.text = quizObject.answers[4]

binding.nextButton.isEnabled = false
binding.previousButton.isEnabled = tempInt >= 2

// Сделать проверку наличия ответов
if (tempInt > 4) binding.nextButton.text = "Submit"
}

binding.nextButton.setOnClickListener {
if (tempInt > 4) listener?.runResultActivity()
else listener?.nextFragment()
}

binding.previousButton.setOnClickListener {
listener?.backFragment()
}

binding.toolbar.setOnClickListener {
listener?.backFragment()
}

binding.radioGroup.setOnCheckedChangeListener { _, checkId ->
when (checkId) {
binding.optionOne.id -> listener?.addAnswer(tempInt, 1)
binding.optionTwo.id -> listener?.addAnswer(tempInt, 2)
binding.optionThree.id -> listener?.addAnswer(tempInt, 3)
binding.optionFour.id -> listener?.addAnswer(tempInt, 4)
binding.optionFive.id -> listener?.addAnswer(tempInt, 5)

}
binding.nextButton.isEnabled = true
}
}

override fun onDestroyView() {
super.onDestroyView()
_binding = null
}

}
33 changes: 33 additions & 0 deletions app/src/main/java/com/rsschool/quiz/DaoArrayList.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.rsschool.quiz

class DaoArrayList {

private val quizGames: List<QuizObject> = mutableListOf(
QuizObject("Вы готовы, дети?", listOf("Да, капитан!", "Да!", "Нет.", "Нет, капитан", "буль-буль-буль"), 1, 1),
QuizObject("Ктоооооооо... Кто проживает на дне океана?", listOf("Рыбки", "Губка Боб Квадратные Штаны!", "Водолаз", "Никто не проживает", "Terror from the Deep"), 2,2),
QuizObject("Жёлтая губка, малыш без изъяна?", listOf("С изъяном", "Не малышь", "Губка Боб Квадратные Штаны!", "Синяя губка", "Жёлтая подводная лодка"), 3,3),
QuizObject("Кто побеждает всегда и везде?", listOf("Годзилла", "Рэмбо", "Капитан Америка", "Губка Боб Квадратные Штаны!", "Фиолетовый из Повер Рэнджерс"), 4,4),
QuizObject("Кто также ловок, как рыба в воде?", listOf("Другая рыба", "Аквамен", "Глубина", "Тазик залитый бетоном", "Губка Боб Квадратные Штаны!"), 5,5),
)

private val nullQuizObject = QuizObject("nullQuizObject", listOf("nullQuizObject", "nullQuizObject", "nullQuizObject", "nullQuizObject", "nullQuizObject"), 1,1)

fun getQuizObject(num: Int) : QuizObject {
return if (num <= quizGames.lastIndex) quizGames[num] else nullQuizObject
}

fun getQuizQuestion(num: Int) : String {
return if (num <= quizGames.lastIndex) quizGames[num].question else nullQuizObject.question
}

fun getQuizCorrectAnswer(num: Int) : Int {
return if (num <= quizGames.lastIndex) quizGames[num].numberCorrectAnswer else nullQuizObject.numberCorrectAnswer
}

fun getQuizAnswers(num: Int) : List<String> {
return if (num <= quizGames.lastIndex) quizGames[num].answers else nullQuizObject.answers
}

fun getSize() : Int = quizGames.lastIndex + 1

}
61 changes: 58 additions & 3 deletions app/src/main/java/com/rsschool/quiz/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -1,11 +1,66 @@
package com.rsschool.quiz

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.fragment.app.FragmentActivity
import androidx.viewpager2.widget.ViewPager2
import com.rsschool.quiz.databinding.ActivityMainBinding


// MainActivity Унаследуем от FragmentActivity.
public class MainActivity : FragmentActivity(), ActionListener {
// Объявим переменные для адаптера и вьюпейджера.
private lateinit var adapter: NumberAdapter
private lateinit var viewPager: ViewPager2
// private lateinit var resultFragment: ResultFragment

// Ресурсы
private lateinit var binding: ActivityMainBinding
private val user: UserObject = UserObject( "Jesus", hashMapOf())
private val dataQuiz = DaoArrayList()
private var messageResult = "No result"

class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

// Чтобы создать объект класса ResultProfileBinding, надо вызвать статический метод inflate()
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)

// В методе onCreate инициализируем адаптер, передав ему текущее активити как владелец жизненного цикла
adapter = NumberAdapter(this)
// находим вьюпейджер по идентификатору и передаем ему адаптер.
viewPager = findViewById(R.id.pager)
viewPager.adapter = adapter
}

override fun currentFragment(): Int {
return viewPager.currentItem
}

override fun nextFragment() {
++viewPager.currentItem
}

override fun backFragment() {
--viewPager.currentItem
}

override fun runResultActivity() {

var result = 0
for (x in 0..4) {
if (dataQuiz.getQuizCorrectAnswer(x) == user.numAnswers[x+1]) ++result
}
messageResult = "Результат квиза: $result из 5."

// resultFragment = ResultFragment.newInstance(messageResult, "test")
// val transaction = supportFragmentManager.beginTransaction()
// transaction.add(R.id.container, resultFragment)
// transaction.commit()
}

override fun addAnswer(numberQuest: Int, numberAnswer: Int) {
user.numAnswers[numberQuest] = numberAnswer
}

}
31 changes: 31 additions & 0 deletions app/src/main/java/com/rsschool/quiz/NumberAdapter.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.rsschool.quiz

import android.os.Bundle
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import androidx.viewpager2.adapter.FragmentStateAdapter

// Адаптер - специальный компонент, который связывает источник данных с виджетом списка.
// Создадим адаптер, задачей которого будет предоставление фрагментов для слайдера:
// Как понятно из названия, FragmentStateAdapter работает с фрагментами.
// В зависимости от релизации, в конструктор адаптера нужно передать экземпляр или класса Fragment, или класса FragmentActivity.
class NumberAdapter(fragment: FragmentActivity) : FragmentStateAdapter(fragment) {

// набор данных, которые свяжем со списком
private val dao = DaoArrayList()

// Требуется переопределить метод getItemCount, возвращающий общее количество элементов списка.
override fun getItemCount(): Int = dao.getSize()

// Переопределим метод createFragment, возвращающий фрагмент для каждого элемента слайдера.
override fun createFragment(position: Int): Fragment {
val fragment = BlankFragment()

fragment.arguments = Bundle().apply {
// В бланкФрагмент задан ключ для обращения к данным из Бандла countries[position]
putSerializable(ARG_OBJECT, dao.getQuizObject(position))
}
return fragment
}

}
9 changes: 9 additions & 0 deletions app/src/main/java/com/rsschool/quiz/QuizObject.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.rsschool.quiz

import java.io.Serializable

data class QuizObject(val question: String,
val answers: List<String>,
val numberQuestion: Int,
val numberCorrectAnswer: Int
) : Serializable
6 changes: 6 additions & 0 deletions app/src/main/java/com/rsschool/quiz/UserObject.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.rsschool.quiz

data class UserObject(val name: String,
val numAnswers: HashMap<Int, Int>
) {
}
6 changes: 4 additions & 2 deletions app/src/main/res/layout/fragment_quiz.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
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:layout_height="match_parent"
tools:context=".BlankFragment">

<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appBarLayout"
Expand All @@ -20,7 +21,7 @@
android:fitsSystemWindows="true"
app:navigationContentDescription="Back to the previous question"
app:navigationIcon="@drawable/ic_baseline_chevron_left_24"
app:title="Question 1" />
app:title="Question #" />

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

Expand Down Expand Up @@ -84,6 +85,7 @@
app:layout_constraintStart_toStartOf="@id/margin_start_guideline"
app:layout_constraintTop_toBottomOf="@id/question">


<RadioButton
android:id="@+id/option_one"
android:layout_width="wrap_content"
Expand Down