Darotudeen
Darotudeen

Reputation: 2518

Accessing view of parent fragment from a child fragment connected by viewpager

I have a fragment which happens to be the host fragment with a view pager to three other fragment. I want to access the view pager in the parent fragment from the children so I can manage the currentItem property on button click but using parentFragment is not working.

Parent Fragment

class ClientFragment : DaggerFragment() {
    lateinit var adapter: ViewPagerAdapter
    private lateinit var nextBtn: Button
    private lateinit var progressBar: ProgressBar
    private val title by lazy {
        getName()
    }
    val clientManagementViewPager by lazy {
        (client_management_included_viewPager as? ViewPager2)
    }
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_client, container, false)
    }

    override fun onResume() {
        super.onResume()

        setupViewPager()
        val toolbar = (client_management_toolbar as Toolbar)
        toolbar.setTitleTextColor(
            ContextCompat.getColor(
                requireContext(),
                R.color.colorPrimaryDark
            )
        )

        val navController = Navigation.findNavController(client_management_appBar)


        NavigationUI.setupWithNavController(toolbar, navController)
        nextBtn = client_account_next_btn2.findViewById(R.id.btn)
        progressBar = client_account_next_btn2.findViewById(R.id.progress_bar)

        val nextBtnBackground =
            ContextCompat.getDrawable(requireContext(), R.drawable.rounded_corner_background)
        nextBtnBackground?.colorFilter = PorterDuffColorFilter(
            ContextCompat.getColor(requireContext(), R.color.colorPrimary),
            PorterDuff.Mode.SRC_IN
        )

        nextBtn.text = getString(R.string.next)
        nextBtn.background = nextBtnBackground
        nextBtn.setTextColor(ContextCompat.getColor(requireContext(), R.color.colorAccent))

        nextBtn.setOnClickListener {
            clientManagementViewPager?.currentItem = 1
        }

        clientManagementViewPager?.registerOnPageChangeCallback(object :ViewPager2.OnPageChangeCallback(){
            override fun onPageSelected(position: Int) {
                super.onPageSelected(position)
                when(position){
                    1 -> nextBtn.hide()
                    0-> nextBtn.show()
                }
            }

        })

    }
    }

Child Fragment

class ClientAccountFragment : DaggerFragment(){
    private val title by lazy {
        getName()
    }
    private lateinit var nextBtn: Button
    private lateinit var progressBar: ProgressBar

    @Inject
    lateinit var viewModelProviderFactory: ViewModelFactory
    private val authViewModel: AuthViewModel by lazy {
        ViewModelProvider(this, viewModelProviderFactory).get(AuthViewModel::class.java)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_client_account, container, false)
    }


    override fun onResume() {
        super.onResume()


        (parentFragment as? ClientFragment)?.setItem(2)
        
            nextBtn.setOnClickListener {
                Log.i(title, "here2")
                (parentFragment as? ClientFragment)?.clientManagementViewPager?.currentItem = 1
    }
    }
}

Upvotes: 1

Views: 413

Answers (1)

Darotudeen
Darotudeen

Reputation: 2518

I was able to fix this with following lines

val navHostFragment = requireActivity().supportFragmentManager.fragments[0] as NavHostFragment
val parent = navHostFragment.childFragmentManager.primaryNavigationFragment as ClientFragment

Upvotes: 2

Related Questions