android - 当 ViewPager 的 onPageSelected() 调用 Kotlin 时在片段中获取视图 Null
问题描述
使用 Kotlin Android Extensions 进行视图初始化
PageSelected 的活动代码:
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)
}
如果我在 Fragment 中使用相同的函数,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)
}
}
解决方案
View pager 默认只缓存 3 个片段。当前,上一个和下一个。
当您移动到某个页面时,所有超出此范围的页面调用onDestroyView()
并且视图被破坏,即它变为空。当此页面再次进入范围时,它必须再次创建视图,从而调用onCreateView()
. 视图在创建时为空
缓存片段(实际上是视图)的范围可以使用setOffscreenPageLimit(int limit)
.
希望这能解决您的问题。
推荐阅读
- javascript - 使用 e.target 时,未定义不是对象
- python - 如何使用 groupby() 函数在 Python 中制作宿舍?
- ruby - 关于在 Ruby 中实现游戏图形的新手问题
- heroku - 如何在heroku中添加Mozilla firefox
- sharepoint - 如何在没有 spfx 的 sharepoint 在线命令栏上创建自定义操作按钮?
- python - 在不分解关键短语的情况下进行标记
- kotlin - 如果您不确定某个值是否可能为 null,则处理来自 API 的可能的 null 值
- sql - 如果我交叉加入的 2 个表之一有重复,输出中是否也会有重复?
- java - JFR 中 RecordedFile 的调用堆栈是否完整?
- windows - 使用 windows WSL 连接 ECONNREFUSED