Search code examples
androidandroid-fragmentskotlinbottomnavigationview

How to speedup when change fragment in Android


WHY NOT ANY PEOPLE HELP TO ME???

In my application I used BottomNavBar and NavigationGraph for show some fragments!
In one of my fragments I have many views (fragment layout has 1069 lines xml codes) and when select this fragment from BottomNavBar, after some second show me this fragment.
In the other words show me this fragment with delay!

Fragment codes:

class HomeDashboardFragment : Fragment(), HomeDashboardContracts.View {

    @NonNull
    private var pageTitle: TextView? = null
    @NonNull
    private var menuIcon: TextView? = null
    private lateinit var token: String
    private lateinit var presenter: HomeDashboardPresenterImpl
    private var giftExpireSplit: List<String> = emptyList()
    private var giftExpireDate: List<String> = emptyList()
    private var timeUtils: TimeUtils? = null
    @NonNull
    private var disposable: Disposable? = null

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

    @SuppressLint("WrongConstant")
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        //Initialize
        presenter = HomeDashboardPresenterImpl(requireContext(), this)
        //Initialize views from activity
        activity?.let { itActivity ->
            pageTitle = itActivity.findViewById(R.id.toolbarMain_title)
            menuIcon = itActivity.findViewById(R.id.toolbarMain_menuIcon)
            //Set title
            pageTitle?.let { itTitle ->
                itTitle.text = getString(R.string.menuHomeDashboard)
            }
            //Open menu
            menuIcon?.let { itMenu ->
                itMenu.setOnClickListener {
                    itActivity.findViewById<AwesomeDrawerLayout>(R.id.homePage_drawerLayout).openDrawer(Gravity.END)
                }
            }
            //Get token
            token = GoodPrefs.getInstance().getString(PrefsKey.USER_JWT_TOKEN.name, "")
            //User registered
            if (GoodPrefs.getInstance().isKeyExists(PrefsKey.USER_JWT_TOKEN.name)) {
                menuIcon?.visibility = View.VISIBLE
            }
            //Set layout
            presenter.checkRegisterUser(token)
            //Load profile data
            if (!isEmptyString(token)) {
                presenter.getProfile(token, USER_NOTIF_ID)
            }
        }
    }

MainActivity codes for set fragments into BottomNavBar with NavigationGraph :

private fun setupNavigation() {
    val navController = Navigation.findNavController(this, R.id.homePage_fragmentNavHost)
    NavigationUI.setupWithNavController(homePage_bottomNavBar, navController)
}

override fun onSupportNavigateUp() = Navigation.findNavController(this, R.id.homePage_fragmentNavHost).navigateUp()

How can i fix this issue?


Solution

  • You can add a layout dummy consisting of a single viewGroup. Then in the onViewCreated method inflate the real layout. For example:

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?) =
           inflater.inflate(R.layout.layout_dummy, container, false);
    
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
    
            Handler().post {
                val layout = flContainer
                val child = layoutInflater.inflate(R.layout.fragment_real, null)
                layout.removeAllViews()
                layout.addView(child)
    
                setupToolbar()
                setupWebView()
            }
        }
    
    
    layout_dummy.xml
    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout
            android:id="@+id/flContainer"
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
    </FrameLayout>