Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
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
4 changes: 4 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,15 @@ android {
kotlinOptions {
jvmTarget = '17'
}
buildFeatures {
viewBinding = true
}
}

dependencies {

implementation 'androidx.core:core-ktx:1.7.0'
implementation("androidx.fragment:fragment-ktx:1.7.0")
implementation 'androidx.appcompat:appcompat:1.5.1'
implementation 'com.google.android.material:material:1.6.1'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
Expand Down
6 changes: 6 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,12 @@
android:supportsRtl="true"
android:theme="@style/Theme.Fragments"
tools:targetApi="31">
<activity
android:name=".ActivityB"
android:exported="false" />
<activity
android:name=".ActivityA"
android:exported="false" />
<activity
android:name=".MainActivity"
android:exported="true">
Expand Down
27 changes: 27 additions & 0 deletions app/src/main/java/otus/gpb/homework/fragments/ActivityA.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package otus.gpb.homework.fragments

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import otus.gpb.homework.fragments.databinding.ActivityABinding

class ActivityA : AppCompatActivity() {

private lateinit var binding: ActivityABinding

private lateinit var fragmentA: FragmentA

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityABinding.inflate(layoutInflater)
setContentView(binding.root)
fragmentA = if (savedInstanceState == null) {
FragmentA.newInstance()
} else {
supportFragmentManager.findFragmentByTag("fragmentA") as FragmentA
}
supportFragmentManager.beginTransaction()
.replace(R.id.fragment_activity_a, fragmentA, "fragmentA")
.commit()

}
}
50 changes: 50 additions & 0 deletions app/src/main/java/otus/gpb/homework/fragments/ActivityB.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package otus.gpb.homework.fragments

import android.R.attr.orientation
import android.content.res.Configuration
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import otus.gpb.homework.fragments.databinding.ActivityBBinding

class ActivityB : AppCompatActivity() {

private lateinit var binding: ActivityBBinding

private lateinit var fragmentBA: FragmentBA
private lateinit var fragmentBB: FragmentBB


override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityBBinding.inflate(layoutInflater)
setContentView(binding.root)

if (resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) {
fragmentBA = savedInstanceState
?.let { supportFragmentManager.findFragmentByTag(FragmentBA::class.simpleName) as? FragmentBA }
?: FragmentBA()

fragmentBB = savedInstanceState
?.let { supportFragmentManager.findFragmentByTag(FragmentBB::class.simpleName) as? FragmentBB }
?: FragmentBB()

supportFragmentManager.beginTransaction()
.replace(R.id.fragment_b_a_container, fragmentBA, FragmentBA::class.simpleName)
.replace(R.id.fragment_b_b_container, fragmentBB, FragmentBB::class.simpleName)
.addToBackStack(null)
.commit()
} else {
fragmentBA = savedInstanceState
?.let { supportFragmentManager.findFragmentByTag(FragmentBA::class.simpleName) as? FragmentBA }
?: FragmentBA()
supportFragmentManager.beginTransaction()
.replace(R.id.fragment_b_a_container, fragmentBA, FragmentBA::class.simpleName)
.addToBackStack(null)
.commit()
}


}


}
72 changes: 72 additions & 0 deletions app/src/main/java/otus/gpb/homework/fragments/FragmentA.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package otus.gpb.homework.fragments

import android.content.Context
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.activity.OnBackPressedCallback
import androidx.fragment.app.Fragment
import otus.gpb.homework.fragments.databinding.FragmentABinding


class FragmentA : Fragment() {
private var _binding: FragmentABinding? = null

private val binding get() = _binding!!

private lateinit var fragmentAA: FragmentAA

override fun onAttach(context: Context) {
super.onAttach(context)

val callback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
if (childFragmentManager.backStackEntryCount > 0) {
childFragmentManager.popBackStack()
} else {
isEnabled = false
requireActivity().onBackPressedDispatcher.onBackPressed()
}
}
}
requireActivity().onBackPressedDispatcher.addCallback(callback)
}

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentABinding.inflate(inflater, container, false)
val root: View = binding.root
return root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
fragmentAA = if (savedInstanceState == null) {
FragmentAA.newInstance(ColorGenerator.generateColor())
} else {
childFragmentManager.findFragmentByTag("fragmentAA") as FragmentAA
}
with(binding) {
fragmentAAButton.setOnClickListener {
childFragmentManager.beginTransaction()
.replace(fragmentAContainer.id, fragmentAA, "fragmentAA")
.addToBackStack("fragmentA")
.commit()
}
}
}

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

companion object {
@JvmStatic
fun newInstance() = FragmentA()
}
}
68 changes: 68 additions & 0 deletions app/src/main/java/otus/gpb/homework/fragments/FragmentAA.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package otus.gpb.homework.fragments

import android.graphics.Color
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import otus.gpb.homework.fragments.databinding.FragmentAABinding

const val COLOR_ARG_PARAM = "color"

class FragmentAA : Fragment() {

private var _binding: FragmentAABinding? = null

private val binding get() = _binding!!

private lateinit var fragmentAB: FragmentAB

private var color: Int = Color.CYAN

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
color = it.getInt(COLOR_ARG_PARAM)
}
}

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
): View {
_binding = FragmentAABinding.inflate(inflater, container, false)
val root: View = binding.root
binding.root.setBackgroundColor(color)
return root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
fragmentAB = if (savedInstanceState == null) {
FragmentAB.newInstance(ColorGenerator.generateColor())
} else {
parentFragmentManager.findFragmentByTag("fragmentAB") as FragmentAB
}
with(binding) {
fragmentABButton.setOnClickListener {
parentFragmentManager.beginTransaction()

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Используем childFragmentManager

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А тогда FragmentAB будет же child от фрагмента FragmentAA, а по заданию он должен быть child от FragmentA?
Проверил по hash FragmentManager. childFragmentManager в FragmentA совпадает по hash c parentFragmentManager в FragmentAA.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@uatilman Юрий, вы правы! АА у нас через чайлд, а для АВ уже перент. Затроили меня буквенные фрагменты.

.replace(fragmentAAContainer.id, fragmentAB, "fragmentAB")
.addToBackStack("fragmentA").commit()
}
}
}

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

companion object {
@JvmStatic
fun newInstance(param1: Int) = FragmentAA().apply {
arguments = Bundle().apply {
putInt(COLOR_ARG_PARAM, param1)
}
}
}
}
50 changes: 50 additions & 0 deletions app/src/main/java/otus/gpb/homework/fragments/FragmentAB.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package otus.gpb.homework.fragments

import android.graphics.Color
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import otus.gpb.homework.fragments.databinding.FragmentABBinding

class FragmentAB : Fragment() {


private var _binding: FragmentABBinding? = null
private val binding get() = _binding!!

private var color: Int = Color.CYAN

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
color = it.getInt(COLOR_ARG_PARAM)
}
}

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentABBinding.inflate(inflater, container, false)
val root: View = binding.root
binding.root.setBackgroundColor(color)
return root
}

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

companion object {
@JvmStatic
fun newInstance(param1: Int) =
FragmentAB().apply {
arguments = Bundle().apply {
putInt(COLOR_ARG_PARAM, param1)
}
}
}
}
58 changes: 58 additions & 0 deletions app/src/main/java/otus/gpb/homework/fragments/FragmentBA.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package otus.gpb.homework.fragments

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.fragment.app.setFragmentResultListener
import otus.gpb.homework.fragments.databinding.FragmentBABinding
import otus.gpb.homework.fragments.utils.COLOR_RESULT_BUNDLE_KEY_BB_TO_BA
import otus.gpb.homework.fragments.utils.COLOR_RESULT_KEY_BB_TO_BA


class FragmentBA : Fragment() {
private var _binding: FragmentBABinding? = null
private val binding get() = _binding!!

private lateinit var fragmentBB: FragmentBB

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentBABinding.inflate(inflater, container, false)
val root: View = binding.root
return root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
fragmentBB = savedInstanceState
?.let {
parentFragmentManager.getFragment(savedInstanceState, "fragmentBB") as? FragmentBB
}
?: FragmentBB()

setFragmentResultListener(COLOR_RESULT_KEY_BB_TO_BA) { _, bundle ->
val color: Int = bundle.getInt(COLOR_RESULT_BUNDLE_KEY_BB_TO_BA)
binding.root.setBackgroundColor(color)
}

binding.fragmentBBButton?.setOnClickListener {
parentFragmentManager.beginTransaction()
.replace(R.id.fragment_b_a_container, fragmentBB, FragmentBB::class.simpleName)
.addToBackStack(null)
.commit()

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Когда FragmentBB отправляет цвет обратно, FragmentBA может быть не готов его принять. Также пользователь не может вернуться к FragmentBA. Добавьте транзакцию в backStack через addToBackStack(null), чтобы FragmentBA сохранялся и мог получить результат.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Исправлено.

}

}

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


}
Loading