From 8c734ac2635f955cb7a30042892dfa8a2ab911e0 Mon Sep 17 00:00:00 2001 From: Karavaev Date: Thu, 15 Jan 2026 21:51:20 +0300 Subject: [PATCH] Homework_Fragments --- app/src/main/AndroidManifest.xml | 6 +++ .../otus/gpb/homework/fragments/ActivityA.kt | 16 ++++++ .../otus/gpb/homework/fragments/ActivityB.kt | 16 ++++++ .../otus/gpb/homework/fragments/FragmentA.kt | 54 +++++++++++++++++++ .../otus/gpb/homework/fragments/FragmentAA.kt | 41 ++++++++++++++ .../otus/gpb/homework/fragments/FragmentAB.kt | 37 +++++++++++++ .../otus/gpb/homework/fragments/FragmentB.kt | 31 +++++++++++ .../otus/gpb/homework/fragments/FragmentBA.kt | 46 ++++++++++++++++ .../otus/gpb/homework/fragments/FragmentBB.kt | 36 +++++++++++++ .../gpb/homework/fragments/MainActivity.kt | 12 ++++- .../main/res/layout-land/activity_b_land.xml | 26 +++++++++ app/src/main/res/layout/activity_a.xml | 8 +++ app/src/main/res/layout/activity_b.xml | 6 +++ app/src/main/res/layout/activity_main.xml | 14 ++++- app/src/main/res/layout/fragment_a.xml | 40 ++++++++++++++ app/src/main/res/layout/fragment_aa.xml | 34 ++++++++++++ app/src/main/res/layout/fragment_ab.xml | 13 +++++ app/src/main/res/layout/fragment_ba.xml | 34 ++++++++++++ app/src/main/res/layout/fragment_bb.xml | 34 ++++++++++++ app/src/main/res/values/strings.xml | 11 ++++ app/src/main/res/values/styles.xml | 6 +++ build.gradle | 4 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 23 files changed, 521 insertions(+), 6 deletions(-) create mode 100644 app/src/main/java/otus/gpb/homework/fragments/ActivityA.kt create mode 100644 app/src/main/java/otus/gpb/homework/fragments/ActivityB.kt create mode 100644 app/src/main/java/otus/gpb/homework/fragments/FragmentA.kt create mode 100644 app/src/main/java/otus/gpb/homework/fragments/FragmentAA.kt create mode 100644 app/src/main/java/otus/gpb/homework/fragments/FragmentAB.kt create mode 100644 app/src/main/java/otus/gpb/homework/fragments/FragmentB.kt create mode 100644 app/src/main/java/otus/gpb/homework/fragments/FragmentBA.kt create mode 100644 app/src/main/java/otus/gpb/homework/fragments/FragmentBB.kt create mode 100644 app/src/main/res/layout-land/activity_b_land.xml create mode 100644 app/src/main/res/layout/activity_a.xml create mode 100644 app/src/main/res/layout/activity_b.xml create mode 100644 app/src/main/res/layout/fragment_a.xml create mode 100644 app/src/main/res/layout/fragment_aa.xml create mode 100644 app/src/main/res/layout/fragment_ab.xml create mode 100644 app/src/main/res/layout/fragment_ba.xml create mode 100644 app/src/main/res/layout/fragment_bb.xml create mode 100644 app/src/main/res/values/styles.xml 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..b8ec4a5 --- /dev/null +++ b/app/src/main/java/otus/gpb/homework/fragments/ActivityA.kt @@ -0,0 +1,16 @@ +package otus.gpb.homework.fragments + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity + +class ActivityA : AppCompatActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_a) + + supportFragmentManager.beginTransaction() + .replace(R.id.activity_a, 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..ef39ea2 --- /dev/null +++ b/app/src/main/java/otus/gpb/homework/fragments/ActivityB.kt @@ -0,0 +1,16 @@ +package otus.gpb.homework.fragments + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity + +class ActivityB : AppCompatActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_b) + + supportFragmentManager.beginTransaction() + .replace(R.id.activity_b, FragmentB()) + .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..0422427 --- /dev/null +++ b/app/src/main/java/otus/gpb/homework/fragments/FragmentA.kt @@ -0,0 +1,54 @@ +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 com.google.android.material.button.MaterialButton + +class FragmentA : Fragment() { + + private fun generateBackgroundColor() = ColorGenerator.generateColor() + + override fun onAttach(context: Context) { + super.onAttach(context) + val callback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + if (childFragmentManager.backStackEntryCount > 1) childFragmentManager.popBackStack() + else { + isEnabled = false + requireActivity().onBackPressedDispatcher.onBackPressed() + } + } + } + requireActivity().onBackPressedDispatcher.addCallback(this, callback) + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + return inflater.inflate(R.layout.fragment_a, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + view.findViewById(R.id.fragment_a_btn).setOnClickListener { + childFragmentManager.beginTransaction() + .replace(R.id.fragment_aa, FragmentAA.newInstance(generateBackgroundColor())) + .addToBackStack(null) + .commit() + } + } + + fun createFragmentAB() { + childFragmentManager.beginTransaction() + .replace(R.id.fragment_aa, FragmentAB.newInstance(generateBackgroundColor())) + .addToBackStack(null) + .commit() + } +} \ 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..d69e371 --- /dev/null +++ b/app/src/main/java/otus/gpb/homework/fragments/FragmentAA.kt @@ -0,0 +1,41 @@ +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 com.google.android.material.button.MaterialButton + +private const val COLOR_ARG = "color_arg" + +class FragmentAA : Fragment() { + + private fun getBackgroundColor() = arguments?.getInt(COLOR_ARG) ?: Color.WHITE + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + return inflater.inflate(R.layout.fragment_aa, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + view.setBackgroundColor(getBackgroundColor()) + view.findViewById(R.id.fragment_ab_btn).setOnClickListener { + (parentFragment as FragmentA).createFragmentAB() + } + } + + companion object { + fun newInstance(color: Int): FragmentAA { + fun setBundleArgument() = Bundle().apply { putInt(COLOR_ARG, color) } + return FragmentAA().apply { + arguments = setBundleArgument() + } + } + } +} \ 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..f31263c --- /dev/null +++ b/app/src/main/java/otus/gpb/homework/fragments/FragmentAB.kt @@ -0,0 +1,37 @@ +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 + +private const val COLOR_ARG = "color_arg" + +class FragmentAB : Fragment() { + + private fun getBackgroundColor() = arguments?.getInt(COLOR_ARG) ?: Color.WHITE + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + return inflater.inflate(R.layout.fragment_ab, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + view.setBackgroundColor(getBackgroundColor()) + } + + companion object { + fun newInstance(color: Int): FragmentAB { + fun setBundleArgument () = Bundle().apply { putInt(COLOR_ARG, color) } + return FragmentAB().apply { + arguments = setBundleArgument() + } + } + } +} \ 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..244042c --- /dev/null +++ b/app/src/main/java/otus/gpb/homework/fragments/FragmentB.kt @@ -0,0 +1,31 @@ +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.fragment.app.Fragment + +class FragmentB : Fragment() { + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + if (resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) { + childFragmentManager.beginTransaction() + .replace(R.id.fragment_ba, FragmentBA()) + .replace(R.id.fragment_bb, FragmentBB()) + .addToBackStack(null) + .commit() + return inflater.inflate(R.layout.activity_b_land, container, false) + } else { + childFragmentManager.beginTransaction() + .replace(R.id.activity_b, FragmentBA()) + .addToBackStack(null) + .commit() + return inflater.inflate(R.layout.activity_b, container, false) + } + } +} \ 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..1faf6a3 --- /dev/null +++ b/app/src/main/java/otus/gpb/homework/fragments/FragmentBA.kt @@ -0,0 +1,46 @@ +package otus.gpb.homework.fragments + +import android.content.res.Configuration +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 com.google.android.material.button.MaterialButton + +private const val COLOR_ARG = "color_arg" +private const val FRAGMENT_REQUESTED_COLOR = "fr_req_color" + +class FragmentBA : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + return inflater.inflate(R.layout.fragment_ba, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + parentFragmentManager.setFragmentResultListener(FRAGMENT_REQUESTED_COLOR, this) { _, bundle -> + val backgroundColor = bundle.getInt(COLOR_ARG, Color.WHITE) + view.setBackgroundColor(backgroundColor) + } + + val openBbBtn = view.findViewById(R.id.fragment_bb_btn) + + if (resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) { + openBbBtn.visibility = View.GONE + } else { + openBbBtn.setOnClickListener { + parentFragmentManager.beginTransaction() + .replace(R.id.activity_b, FragmentBB()) + .addToBackStack(null) + .commit() + } + } + } +} \ 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..60c0fea --- /dev/null +++ b/app/src/main/java/otus/gpb/homework/fragments/FragmentBB.kt @@ -0,0 +1,36 @@ +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.fragment.app.Fragment +import com.google.android.material.button.MaterialButton + +private const val COLOR_ARG = "color_arg" +private const val FRAGMENT_REQUESTED_COLOR = "fr_req_color" + +class FragmentBB : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + return inflater.inflate(R.layout.fragment_bb, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + view.findViewById(R.id.send_color_btn).setOnClickListener { + val result = Bundle().apply { putInt(COLOR_ARG, ColorGenerator.generateColor()) } + parentFragmentManager.setFragmentResult(FRAGMENT_REQUESTED_COLOR, result) + + if (resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT) { + parentFragmentManager.popBackStack() + } + } + + } +} \ 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..9883330 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,22 @@ package otus.gpb.homework.fragments +import android.content.Intent import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.google.android.material.button.MaterialButton class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) + + findViewById(R.id.activity_a_btn).setOnClickListener { + startActivity(Intent(this, ActivityA::class.java)) + } + + findViewById(R.id.activity_b_btn).setOnClickListener { + startActivity(Intent(this, ActivityB::class.java)) + } } -} \ No newline at end of file +} diff --git a/app/src/main/res/layout-land/activity_b_land.xml b/app/src/main/res/layout-land/activity_b_land.xml new file mode 100644 index 0000000..15a4d81 --- /dev/null +++ b/app/src/main/res/layout-land/activity_b_land.xml @@ -0,0 +1,26 @@ + + + + + + + + + + \ 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..36d5b37 --- /dev/null +++ b/app/src/main/res/layout/activity_a.xml @@ -0,0 +1,8 @@ + + + \ 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..0989962 --- /dev/null +++ b/app/src/main/res/layout/activity_b.xml @@ -0,0 +1,6 @@ + + + \ 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..e23a813 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"> - + + \ 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..aab9348 --- /dev/null +++ b/app/src/main/res/layout/fragment_a.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_aa.xml b/app/src/main/res/layout/fragment_aa.xml new file mode 100644 index 0000000..5e82500 --- /dev/null +++ b/app/src/main/res/layout/fragment_aa.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_ab.xml b/app/src/main/res/layout/fragment_ab.xml new file mode 100644 index 0000000..7625bec --- /dev/null +++ b/app/src/main/res/layout/fragment_ab.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_ba.xml b/app/src/main/res/layout/fragment_ba.xml new file mode 100644 index 0000000..fbc0d03 --- /dev/null +++ b/app/src/main/res/layout/fragment_ba.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_bb.xml b/app/src/main/res/layout/fragment_bb.xml new file mode 100644 index 0000000..3cd85df --- /dev/null +++ b/app/src/main/res/layout/fragment_bb.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + \ 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..3d63ff3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,3 +1,14 @@ Fragments + open Activity A + open Activity B + Fragment A + Fragment AA + Fragment AB + Fragment BA + Fragment BB + open Fragment AB + open Fragment AA + open Fragment BB + Send color \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..d103b11 --- /dev/null +++ b/app/src/main/res/values/styles.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index bd20018..598d925 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id 'com.android.application' version '8.7.2' apply false - id 'com.android.library' version '8.7.2' apply false + id 'com.android.application' version '8.12.3' apply false + id 'com.android.library' version '8.12.3' apply false id 'org.jetbrains.kotlin.android' version '2.0.21' apply false } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 1f1d072..f464719 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Tue Nov 05 08:41:56 CET 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists