Когда я нажимаю кнопку "Назад" или делаю жест на go назад, он не перезагружает ViewPager должным образом - PullRequest
0 голосов
/ 08 апреля 2020

Я использую Навигационный компонент, хотя не думаю, что это проблема. Дело в том, что когда я нахожусь во фрагменте, который содержит ViewPager, и я перехожу к другому, когда я go возвращаюсь назад с помощью кнопки «назад» или жеста мобильного телефона, он возвращается к предыдущему фрагменту, но перестает показывать 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)
    }
}

Когда вы загружаете фрагмент в первый раз, он показывается примерно так, как это должно быть показано, и если я использую Нижний Навигационный Вид, это тоже хорошо:

enter image description here

Но когда я использую кнопку возврата на моем телефоне вот что происходит:

enter image description here

1 Ответ

0 голосов
/ 08 апреля 2020

Проблема в вашем HomeFragment, setFlagsAdapter (it) `не вызывается, когда вы возвращаетесь к этому фрагменту. Либо

изменить observeOnce на observe

или

Переместить

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

с onCreateView на

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