diff --git a/app/build.gradle b/app/build.gradle index c5cf1b8..5ed27e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -34,6 +34,9 @@ android { kotlinOptions { jvmTarget = '17' } + buildFeatures { + viewBinding = true + } } dependencies { @@ -45,4 +48,5 @@ dependencies { testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' + implementation 'androidx.activity:activity:1.9.3' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9604b34..bee542a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -12,12 +12,17 @@ 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..25f08fa --- /dev/null +++ b/app/src/main/java/otus/gpb/homework/fragments/ActivityA.kt @@ -0,0 +1,29 @@ +package otus.gpb.homework.fragments + +import android.os.Bundle +import android.window.OnBackInvokedDispatcher +import androidx.activity.enableEdgeToEdge +import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import otus.gpb.homework.fragments.databinding.ActivityABinding +import otus.gpb.homework.fragments.databinding.ActivityMainBinding +import otus.gpb.homework.fragments.fragments.FragmentA + +class ActivityA : AppCompatActivity() { + private lateinit var binding: ActivityABinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + enableEdgeToEdge() + binding = ActivityABinding.inflate(layoutInflater) + setContentView(binding.root) + + if (savedInstanceState == null) { + supportFragmentManager.beginTransaction() + .replace(R.id.fragmentContainerA, FragmentA(), "FragmentA") + .addToBackStack(null) + .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..2e22493 --- /dev/null +++ b/app/src/main/java/otus/gpb/homework/fragments/ActivityB.kt @@ -0,0 +1,46 @@ +package otus.gpb.homework.fragments + +import android.content.res.Configuration +import android.os.Bundle +import androidx.activity.enableEdgeToEdge +import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.isVisible +import otus.gpb.homework.fragments.databinding.ActivityBBinding +import otus.gpb.homework.fragments.fragments.FragmentBA +import otus.gpb.homework.fragments.fragments.FragmentBB + +class ActivityB : AppCompatActivity() { + + private lateinit var binding: ActivityBBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + enableEdgeToEdge() + binding = ActivityBBinding.inflate(layoutInflater) + setContentView(binding.root) + + supportFragmentManager.beginTransaction() + .replace(R.id.fragmentContainerBA, FragmentBA()) + .replace(R.id.fragmentContainerBB, FragmentBB()) + .commit() + + switchFragments() + } + + private fun switchFragments() { + + val currentOrientation = resources.configuration.orientation + if (currentOrientation == Configuration.ORIENTATION_PORTRAIT) { + with(binding) { + fragmentContainerBA.isVisible = true + fragmentContainerBB.isVisible = false + } + + } else { + with(binding) { + fragmentContainerBA.isVisible = true + fragmentContainerBB.isVisible = true + } + } + } +} \ 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..b7296fe --- /dev/null +++ b/app/src/main/java/otus/gpb/homework/fragments/FragmentA.kt @@ -0,0 +1,52 @@ +package otus.gpb.homework.fragments.fragments + +import android.os.Bundle +import android.util.Log +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.ColorGenerator +import otus.gpb.homework.fragments.R +import otus.gpb.homework.fragments.databinding.ActivityMainBinding +import otus.gpb.homework.fragments.databinding.FragmentABinding + +private const val KEY = "color" +class FragmentA : Fragment( ) { + + private lateinit var binding: FragmentABinding + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentABinding.inflate(inflater, container, false) + binding.openFragmentAA.isEnabled = true + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + + val bundle = Bundle() + bundle.putInt(KEY, ColorGenerator.generateColor()) + val fragmentAA = FragmentAA() + fragmentAA.arguments = bundle + + binding.openFragmentAA.setOnClickListener { + childFragmentManager.beginTransaction() + .add(R.id.fragmentContainerAA, fragmentAA) + .addToBackStack("fragmentA") + .commit() + binding.openFragmentAA.isEnabled = false + } + + val callback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + activity?.finish() + } + } + requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, callback) + } +} \ 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..61ee84a --- /dev/null +++ b/app/src/main/java/otus/gpb/homework/fragments/FragmentAA.kt @@ -0,0 +1,55 @@ +package otus.gpb.homework.fragments.fragments + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Button +import androidx.activity.OnBackPressedCallback +import androidx.fragment.app.Fragment +import otus.gpb.homework.fragments.ColorGenerator +import otus.gpb.homework.fragments.R +import otus.gpb.homework.fragments.databinding.FragmentAaBinding + + +private const val KEY = "color" +class FragmentAA : Fragment() { + + private lateinit var binding: FragmentAaBinding + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentAaBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + val color = arguments?.getInt(KEY) + if (color != null) { + this.view?.setBackgroundColor(color) + } + + val bundle = Bundle() + bundle.putInt(KEY, ColorGenerator.generateColor()) + val fragmentAB = FragmentAB() + fragmentAB.arguments = bundle + + binding.openFragmentAB.setOnClickListener { + parentFragmentManager.beginTransaction() + .replace(R.id.fragmentContainerAB, fragmentAB) + .addToBackStack("fragmentAA") + .commit() + } + + val callback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + parentFragmentManager.popBackStack() + } + } + requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, callback) + } +} \ 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..eddd8e2 --- /dev/null +++ b/app/src/main/java/otus/gpb/homework/fragments/FragmentAB.kt @@ -0,0 +1,25 @@ +package otus.gpb.homework.fragments.fragments + +import android.os.Bundle +import android.view.View +import androidx.activity.OnBackPressedCallback +import androidx.fragment.app.Fragment +import otus.gpb.homework.fragments.R +private const val KEY = "color" +class FragmentAB : Fragment(R.layout.fragment_ab) { + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + val color = arguments?.getInt(KEY) + + if (color != null) { + this.view?.setBackgroundColor(color) + } + + val callback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + parentFragmentManager.popBackStack("fragmentAA", 1) + } + } + requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, callback) + } +} \ No newline at end of file diff --git a/app/src/main/java/otus/gpb/homework/fragments/FragmentB.kt b/app/src/main/java/otus/gpb/homework/fragments/FragmentB.kt new file mode 100644 index 0000000..8808be3 --- /dev/null +++ b/app/src/main/java/otus/gpb/homework/fragments/FragmentB.kt @@ -0,0 +1,6 @@ +package otus.gpb.homework.fragments.fragments + +import androidx.fragment.app.Fragment +import otus.gpb.homework.fragments.R + +class FragmentB : Fragment(R.layout.fragment_b) \ 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..1497536 --- /dev/null +++ b/app/src/main/java/otus/gpb/homework/fragments/FragmentBA.kt @@ -0,0 +1,49 @@ +package otus.gpb.homework.fragments.fragments + +import android.content.res.Configuration +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Button +import androidx.core.view.isVisible +import androidx.fragment.app.Fragment +import otus.gpb.homework.fragments.R +import otus.gpb.homework.fragments.databinding.FragmentABinding +import otus.gpb.homework.fragments.databinding.FragmentBaBinding + +private const val KEY = "color" +private const val REQUEST_KEY = "colorBundle" +class FragmentBA : Fragment() { + + private lateinit var binding: FragmentBaBinding + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentBaBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + parentFragmentManager.setFragmentResultListener(REQUEST_KEY, this) { _, bundle -> + val color = bundle.getInt(KEY) + this.view?.setBackgroundColor(color) + } + + with(binding.openFragmentBB) { + + setOnClickListener { + parentFragmentManager.beginTransaction() + .replace(R.id.fragmentContainerBA, FragmentBB()) + .commit() + } + val currentOrientation = resources.configuration.orientation + isVisible = currentOrientation == Configuration.ORIENTATION_PORTRAIT + } + } +} \ 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..dfee6d3 --- /dev/null +++ b/app/src/main/java/otus/gpb/homework/fragments/FragmentBB.kt @@ -0,0 +1,45 @@ +package otus.gpb.homework.fragments.fragments + +import android.content.res.Configuration +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Button +import androidx.fragment.app.Fragment +import otus.gpb.homework.fragments.ColorGenerator +import otus.gpb.homework.fragments.R +import otus.gpb.homework.fragments.databinding.FragmentBbBinding + +private const val KEY = "color" +private const val REQUEST_KEY = "colorBundle" +class FragmentBB : Fragment(R.layout.fragment_bb) { + + private lateinit var binding: FragmentBbBinding + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentBbBinding.inflate(inflater, container, false) + return binding.root + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + binding.sendColor.setOnClickListener { + val bundle = Bundle() + bundle.putInt(KEY, ColorGenerator.generateColor()) + + parentFragmentManager.setFragmentResult(REQUEST_KEY, bundle) + + val currentOrientation = resources.configuration.orientation + if (currentOrientation == Configuration.ORIENTATION_PORTRAIT) { + parentFragmentManager.beginTransaction() + .add(R.id.fragmentContainerBA, FragmentBA()) + .commit() + } + } + } +} \ 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..8c67384 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,27 @@ 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.openActivityA.setOnClickListener { + startActivity(Intent(this, ActivityA::class.java)) + } + + binding.openActivityB.setOnClickListener { + startActivity(Intent(this, ActivityB::class.java)) + } } -} \ 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..9fc8b56 --- /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..f6c3fea --- /dev/null +++ b/app/src/main/res/layout/activity_b.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + \ 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..59de17f 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -4,15 +4,23 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" + android:padding="20dp" tools:context=".MainActivity"> - + app:layout_constraintStart_toStartOf="parent" /> + +