У меня есть действие, состоящее из кнопки и ViewGroup, в которой я хочу складывать фрагменты.Фрагменты будут просто показывать число 1, 2, 3 ... и, я хочу визуальное поведение нового фрагмента, "скользящего или исчезающего" при покрытии фрагмента с меньшим номером ниже, который должен "остаться на месте".
При извлечении фрагментов из стека с помощью кнопки «Назад» фрагмент с более высоким номером должен «скользить или исчезать» при обнаружении фрагмента с более низким номером, как если бы он был ниже с самого начала.
Я хочуиспользовать API-интерфейсы Transition (android.transition. *) вместе с методами фрагментов setEnterTransition / setExitTransition, чтобы позже я смог добавить общие переходы элементов.
![enter image description here](https://i.stack.imgur.com/Ojw4l.gif)
В видео я заставляю переход "выход" фактически перемещаться (скользить вверх), чтобы легко видеть, что по какой-то причине он рендерит поверх моего нового фрагмента анимацию в.
Это моя главная проблема и вопрос: как я могу сделать покрываемый фрагмент рендерингом ниже моего нового фрагмента, который анимируется?
Кстати, наЯ обнаружил, что фрагмент с меньшим номером, «оставаясь на месте», пока он скрыт, заключается в взломе перехода Fade для фактического возврата Animator, который в основном «ничего» не делает для представления.
Я потратил несколькоПрошло уже несколько часов, и я начинаю думать, что у меня может быть что-то концептуально неправильное, поскольку мои требования кажутся мне наиболее «естественными», которые можно ожидать при «укладке» фрагментов, но в то же время их было довольно невозможно достичь.
Соответствующие части моего кода:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
findViewById<Button>(R.id.button).apply {
setOnClickListener {
stackMagicFragment()
}
}
supportFragmentManager.beginTransaction()
.replace(R.id.injectionPoint, ColorFragment())
.commit()
}
private fun stackMagicFragment() {
supportFragmentManager.beginTransaction()
.setReorderingAllowed(true)
.replace(R.id.injectionPoint, ColorFragment().apply { character = 'a' + supportFragmentManager.backStackEntryCount + 1 })
.addToBackStack(null)
.commit()
}
}
class ColorFragment : Fragment() {
companion object {
private val rnd = Random()
}
var character: Char = 'a'
private val ourColor = Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256))
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enterTransition = Slide(Gravity.END).apply { duration = 1000 }
exitTransition = Slide(Gravity.TOP).apply { duration = 1000 }
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return FrameLayout(requireContext()).apply {
setBackgroundColor(ourColor)
addView(TextView(requireContext()).apply {
text = getOurText()
textSize = 200.toFloat()
gravity = Gravity.CENTER
})
}
}
private fun getOurText(): String {
return "" + character
}
}