Получение визуального поведения стека с использованием переходов фрагмента с помощью replace () - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть действие, состоящее из кнопки и ViewGroup, в которой я хочу складывать фрагменты.Фрагменты будут просто показывать число 1, 2, 3 ... и, я хочу визуальное поведение нового фрагмента, "скользящего или исчезающего" при покрытии фрагмента с меньшим номером ниже, который должен "остаться на месте".

При извлечении фрагментов из стека с помощью кнопки «Назад» фрагмент с более высоким номером должен «скользить или исчезать» при обнаружении фрагмента с более низким номером, как если бы он был ниже с самого начала.

Я хочуиспользовать API-интерфейсы Transition (android.transition. *) вместе с методами фрагментов setEnterTransition / setExitTransition, чтобы позже я смог добавить общие переходы элементов.

enter image description here

В видео я заставляю переход "выход" фактически перемещаться (скользить вверх), чтобы легко видеть, что по какой-то причине он рендерит поверх моего нового фрагмента анимацию в.

Это моя главная проблема и вопрос: как я могу сделать покрываемый фрагмент рендерингом ниже моего нового фрагмента, который анимируется?

Кстати, наЯ обнаружил, что фрагмент с меньшим номером, «оставаясь на месте», пока он скрыт, заключается в взломе перехода 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
    }
}
...