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"> - + +