首页 > 解决方案 > 当我按下后退按钮或做出返回的手势时,它不会正确重新加载 ViewPager

问题描述

我正在使用导航组件,尽管我认为这不是问题。问题是,当我在一个包含 ViewPager 的片段中并导航到另一个片段时,当我使用后退按钮或手机手势返回时,它会返回到上一个片段,但它会停止显示 ViewPager . 我会给你我的那个片段的代码:

class HomeFragment : Fragment() {

    private lateinit var homeFragmentViewModel: HomeFragmentViewModel

    private var listAdapter: FlagsListAdapter? = null
    private var regionName: String? = null

    private val hashtagLabel: TextView by lazy { home_fragment__label__hashtag }
    private val flagViewPager: ViewPager by lazy { home_fragment__viewpager__countries }
    private val countryLabel: TextView by lazy { home_fragment__label__country_name }
    private val showCasesButton: Button by lazy { home_fragment__button__country_cases }

    companion object {
        fun newInstance(): HomeFragment {
            return HomeFragment()
        }
    }

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

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

        homeFragmentViewModel = ViewModelProvider(this).get(HomeFragmentViewModel::class.java)

        homeFragmentViewModel.getCountriesFlagLiveData().observeOnce(viewLifecycleOwner, Observer {
            setFlagsAdapter(it)
        })

        showCasesButton.setOnClickListener {
            val actionNavigateToShowCasesFragment = HomeFragmentDirections.navigateHomeFragmentToShowCasesFragment()
            regionName?.let { regionName -> actionNavigateToShowCasesFragment.regionName = regionName }
            it.findNavController().navigate(actionNavigateToShowCasesFragment)
        }

        setFormatHashtag()
    }


    private fun setFlagsAdapter(flagModelList: List<FlagModel>) {
        listAdapter = context?.let {
            FlagsListAdapter(
                flagModelList,
                it
            )
        }

        flagViewPager.adapter = listAdapter
        flagViewPager.setPadding(130, 0, 130, 0)

        flagViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {

            override fun onPageScrollStateChanged(state: Int) {
                Toast.makeText(GlobalApplication.getContextFromApplication, "Hola", Toast.LENGTH_SHORT).show()
            }

            override fun onPageScrolled(
                position: Int,
                positionOffset: Float,
                positionOffsetPixels: Int
            ) {
                countryLabel.text = ""
                countryLabel.text = flagModelList[position].regionName
                regionName = flagModelList[position].regionName
            }

            override fun onPageSelected(position: Int) {
                countryLabel.text = flagModelList[position].regionName            }
        })
    }

    private fun setFormatHashtag() {
        val text = getString(R.string.home_fragment_hashtag)
        val spannableString = SpannableString(text)
        val foregroundColorSpan = context?.let {
            ForegroundColorSpan(ContextCompat.getColor(it, R.color.hashtagColor))
        }
        spannableString.setSpan(foregroundColorSpan, 0, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)

        hashtagLabel.text = spannableString
    }
}

这是我的活动:

class MainActivity : AppCompatActivity() {

    private val navigationBottomBar by lazy { activity_main__navigation_view__bottom_bar }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        setUpNavigation()
    }

    private fun setUpNavigation() {
        val navController = Navigation.findNavController(this, R.id.activity_main__graph__nav_host)
        NavigationUI.setupWithNavController(navigationBottomBar, navController)
    }
}

当您第一次加载片段时,它会像这样显示,这就是它应该显示的方式,如果我使用底部导航视图,它也做得很好:

在此处输入图像描述

但是当我使用手机上的后退按钮时,会发生以下情况:

在此处输入图像描述

标签: androidandroid-fragmentskotlinandroid-viewpager

解决方案


问题在于您的HomeFragment,setFlagsAdapter(it)` 当您返回此片段时没有被调用。任何一个

更改observeOnceobserve

或者

移动

homeFragmentViewModel.getCountriesFlagLiveData().observeOnce(viewLifecycleOwner, Observer {
        setFlagsAdapter(it)
    })

onCreateView

override fun onResume(){
    super.onResume()
    homeFragmentViewModel.getCountriesFlagLiveData().observeOnce(viewLifecycleOwner, Observer {
        setFlagsAdapter(it)
    })
}

推荐阅读