Получение представления Null во фрагменте, когда onPageSelected () ViewPager вызывает Kotlin - PullRequest
0 голосов
/ 25 апреля 2018

Использование расширений Kotlin Android для инициализации представлений

Код активности для выбранной страницы:

introPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
            override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {

            }

            override fun onPageSelected(position: Int) {
                when(position) {
                    0 -> (pagerAdapter.getItem(position) as SearchFragment).startViewAnimations()
                }
            }

            override fun onPageScrollStateChanged(state: Int) {

            }
        })

Метод фрагмента:

fun startViewAnimations() {
        rippleBack?.startRippleAnimation()
        centerImage?.startAnimation(AnimationUtils.loadAnimation(activity, R.anim.rotate_indefinitely))

        val handler = Handler()
        handler.postDelayed({
            relAllViews?.visibility = View.VISIBLE
            relAllViews?.animate()?.alpha(1.0f)
            rippleBack?.animate()?.alpha(0.0f)
            rippleBack?.visibility = View.GONE
            rippleBack?.stopRippleAnimation()
            centerImage?.clearAnimation()
        }, 3500)
    }

Если я использую ту же функцию в onViewCreated() фрагмента, она прекрасно работает. Пример кода:

override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        startViewAnimations()
    }

Полный фрагмент кода:

package com.beeland.consumer.fragment.appintro

import android.os.Bundle
import android.os.Handler
import android.support.v4.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.animation.AnimationUtils
import com.beeland.consumer.R
import com.beeland.consumer.utils.Utils
import kotlinx.android.synthetic.main.fragment_search.*

/**
 * @author Yash
 * @since 23-04-2018.
 */
class SearchFragment : Fragment() {

    /**
     * Method to replace layouts in App Intro Section
     *
     * @return IntroFragment's new instance
     */
    fun newInstance(): SearchFragment {
        val intro = SearchFragment()
        val args = Bundle()
        args.putString("", "")
        intro.arguments = args
        return intro
    }

    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater!!.inflate(R.layout.fragment_search, container, false)
    }

    override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        startViewAnimations()
    }

    fun startViewAnimations() {
        rippleBack?.startRippleAnimation()
        centerImage?.startAnimation(AnimationUtils.loadAnimation(activity, R.anim.rotate_indefinitely))

        val handler = Handler()
        handler.postDelayed({
            relAllViews?.visibility = View.VISIBLE
            relAllViews?.animate()?.alpha(1.0f)
            rippleBack?.animate()?.alpha(0.0f)
            rippleBack?.visibility = View.GONE
            rippleBack?.stopRippleAnimation()
            centerImage?.clearAnimation()

            handler.postDelayed({
                Utils.bounceAnimationVisible(txt5Km)
            }, 300)

            handler.postDelayed({
                Utils.bounceAnimationVisible(txtPostalDelivery)
            }, 600)

            handler.postDelayed({
                Utils.bounceAnimationVisible(img1)
            }, 900)

            handler.postDelayed({
                Utils.bounceAnimationVisible(img2)
            }, 1200)

            handler.postDelayed({
                Utils.bounceAnimationVisible(img3)
            }, 1500)

            handler.postDelayed({
                Utils.bounceAnimationVisible(imgRes1)
                Utils.bounceAnimationVisible(imgRes2)
                Utils.bounceAnimationVisible(imgRes3)
                Utils.bounceAnimationVisible(imgRes4)
            }, 1800)

        }, 3500)
    }
}

1 Ответ

0 голосов
/ 25 апреля 2018

Просмотр пейджера по умолчанию кэширует только 3 фрагмента.Текущий, предыдущий и следующий.

Когда вы переходите на какую-либо страницу, все страницы, находящиеся вне этого диапазона, вызывают onDestroyView(), и представление уничтожается, т. Е. Оно становится нулевым.Когда эта страница снова попадает в диапазон, она должна снова создать представление, вызывая onCreateView().Представление является нулевым, пока оно создает

Диапазон, в котором будут кэшироваться фрагменты (фактически представления), можно настроить с помощью setOffscreenPageLimit(int limit).

Надеюсь, это решит вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...