diff --git a/app/build.gradle b/app/build.gradle
index c5cf1b8..fc2be4a 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -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'
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 9604b34..46bc072 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -12,6 +12,12 @@
android:supportsRtl="true"
android:theme="@style/Theme.Fragments"
tools:targetApi="31">
+
+
diff --git a/app/src/main/java/otus/gpb/homework/fragments/ActivityA.kt b/app/src/main/java/otus/gpb/homework/fragments/ActivityA.kt
new file mode 100644
index 0000000..b36a990
--- /dev/null
+++ b/app/src/main/java/otus/gpb/homework/fragments/ActivityA.kt
@@ -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()
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/otus/gpb/homework/fragments/ActivityB.kt b/app/src/main/java/otus/gpb/homework/fragments/ActivityB.kt
new file mode 100644
index 0000000..c96abde
--- /dev/null
+++ b/app/src/main/java/otus/gpb/homework/fragments/ActivityB.kt
@@ -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()
+ }
+
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/otus/gpb/homework/fragments/FragmentA.kt b/app/src/main/java/otus/gpb/homework/fragments/FragmentA.kt
new file mode 100644
index 0000000..d053692
--- /dev/null
+++ b/app/src/main/java/otus/gpb/homework/fragments/FragmentA.kt
@@ -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()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/otus/gpb/homework/fragments/FragmentAA.kt b/app/src/main/java/otus/gpb/homework/fragments/FragmentAA.kt
new file mode 100644
index 0000000..a77e2f2
--- /dev/null
+++ b/app/src/main/java/otus/gpb/homework/fragments/FragmentAA.kt
@@ -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()
+ .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)
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/otus/gpb/homework/fragments/FragmentAB.kt b/app/src/main/java/otus/gpb/homework/fragments/FragmentAB.kt
new file mode 100644
index 0000000..43592be
--- /dev/null
+++ b/app/src/main/java/otus/gpb/homework/fragments/FragmentAB.kt
@@ -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)
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/otus/gpb/homework/fragments/FragmentBA.kt b/app/src/main/java/otus/gpb/homework/fragments/FragmentBA.kt
new file mode 100644
index 0000000..ee1734a
--- /dev/null
+++ b/app/src/main/java/otus/gpb/homework/fragments/FragmentBA.kt
@@ -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()
+ }
+
+ }
+
+ override fun onDestroyView() {
+ super.onDestroyView()
+ _binding = null
+ }
+
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/otus/gpb/homework/fragments/FragmentBB.kt b/app/src/main/java/otus/gpb/homework/fragments/FragmentBB.kt
new file mode 100644
index 0000000..4ba9792
--- /dev/null
+++ b/app/src/main/java/otus/gpb/homework/fragments/FragmentBB.kt
@@ -0,0 +1,58 @@
+package otus.gpb.homework.fragments
+
+import android.content.res.Configuration
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.core.os.bundleOf
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.setFragmentResult
+import otus.gpb.homework.fragments.databinding.FragmentBBBinding
+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 FragmentBB : Fragment() {
+ private var _binding: FragmentBBBinding? = null
+
+ private val binding get() = _binding!!
+
+ private lateinit var fragmentBA: FragmentBA
+
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View {
+ _binding = FragmentBBBinding.inflate(inflater, container, false)
+ val root: View = binding.root
+ return root
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ fragmentBA = savedInstanceState
+ ?.let {
+ parentFragmentManager.getFragment(savedInstanceState, "fragmentBA") as? FragmentBA
+ }
+ ?: FragmentBA()
+
+ binding.fragmentBBButton.setOnClickListener {
+ setFragmentResult(
+ COLOR_RESULT_KEY_BB_TO_BA,
+ bundleOf(COLOR_RESULT_BUNDLE_KEY_BB_TO_BA to ColorGenerator.generateColor())
+ )
+ if (resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT) {
+ parentFragmentManager.beginTransaction()
+ .replace(R.id.fragment_b_a_container, fragmentBA, FragmentBA::class.simpleName)
+ .addToBackStack(null)
+ .commit()
+ }
+ }
+ }
+
+ override fun onDestroyView() {
+ super.onDestroyView()
+ _binding = null
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/otus/gpb/homework/fragments/MainActivity.kt b/app/src/main/java/otus/gpb/homework/fragments/MainActivity.kt
index 5e89c44..44c284d 100644
--- a/app/src/main/java/otus/gpb/homework/fragments/MainActivity.kt
+++ b/app/src/main/java/otus/gpb/homework/fragments/MainActivity.kt
@@ -1,12 +1,26 @@
package otus.gpb.homework.fragments
+import android.content.Intent
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
+import otus.gpb.homework.fragments.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
+ private lateinit var binding: ActivityMainBinding
+
+
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_main)
+ binding = ActivityMainBinding.inflate(layoutInflater)
+ setContentView(binding.root)
+ binding.activityAButton.setOnClickListener {
+ startActivity(Intent(this, ActivityA::class.java))
+ }
+ binding.activityBButton.setOnClickListener {
+ startActivity(Intent(this, ActivityB::class.java))
+ }
+
+
}
}
\ No newline at end of file
diff --git a/app/src/main/java/otus/gpb/homework/fragments/utils/Consts.kt b/app/src/main/java/otus/gpb/homework/fragments/utils/Consts.kt
new file mode 100644
index 0000000..fd5e4e0
--- /dev/null
+++ b/app/src/main/java/otus/gpb/homework/fragments/utils/Consts.kt
@@ -0,0 +1,10 @@
+package otus.gpb.homework.fragments.utils
+
+
+const val COLOR_RESULT_KEY_BB_TO_BA = "color_result_bb_to_ba"
+const val COLOR_RESULT_BUNDLE_KEY_BB_TO_BA = "color_result_bundle_bb_to_ba"
+
+
+
+const val COLOR_RESULT_KEY_BA_TO_BB = "color_result_ba_to_bb"
+const val COLOR_RESULT_BUNDLE_KEY_BA_TO_BB = "color_result_bundle_ba_to_bb"
\ No newline at end of file
diff --git a/app/src/main/res/layout-land/activity_b.xml b/app/src/main/res/layout-land/activity_b.xml
new file mode 100644
index 0000000..e905cdd
--- /dev/null
+++ b/app/src/main/res/layout-land/activity_b.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout-land/fragment_b_a.xml b/app/src/main/res/layout-land/fragment_b_a.xml
new file mode 100644
index 0000000..787c55e
--- /dev/null
+++ b/app/src/main/res/layout-land/fragment_b_a.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_a.xml b/app/src/main/res/layout/activity_a.xml
new file mode 100644
index 0000000..f455fc1
--- /dev/null
+++ b/app/src/main/res/layout/activity_a.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_b.xml b/app/src/main/res/layout/activity_b.xml
new file mode 100644
index 0000000..d77664f
--- /dev/null
+++ b/app/src/main/res/layout/activity_b.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 17eab17..a654977 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -6,13 +6,23 @@
android:layout_height="match_parent"
tools:context=".MainActivity">
-
+
+
+ app:layout_constraintTop_toBottomOf="@+id/activity_a_button" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_a.xml b/app/src/main/res/layout/fragment_a.xml
new file mode 100644
index 0000000..a7144be
--- /dev/null
+++ b/app/src/main/res/layout/fragment_a.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_a_a.xml b/app/src/main/res/layout/fragment_a_a.xml
new file mode 100644
index 0000000..36fad2d
--- /dev/null
+++ b/app/src/main/res/layout/fragment_a_a.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_a_b.xml b/app/src/main/res/layout/fragment_a_b.xml
new file mode 100644
index 0000000..6382af1
--- /dev/null
+++ b/app/src/main/res/layout/fragment_a_b.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_b_a.xml b/app/src/main/res/layout/fragment_b_a.xml
new file mode 100644
index 0000000..e422fb6
--- /dev/null
+++ b/app/src/main/res/layout/fragment_b_a.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_b_b.xml b/app/src/main/res/layout/fragment_b_b.xml
new file mode 100644
index 0000000..3452902
--- /dev/null
+++ b/app/src/main/res/layout/fragment_b_b.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 34277aa..9cdbbf4 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1,3 +1,14 @@
Fragments
+ Activity A
+ Activity B
+ To Fragment AA
+ To Fragment AB
+ Hello Fragment A
+ Hello Fragment AA
+ Hello Fragment AB
+ Fragment BA
+ Fragment BB
+ SendColor
+ Open Fragment BB
\ No newline at end of file