Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Navigation with View Binding

I'm trying to replace all findViewById using View Binding. But, I can't change my NavController code line using View Binding.

val navController = findNavController(this, R.id.mainHostFragment)

to

var binding : ActivityMainBinding
val navController = findNavController(this, binding.mainHostFragment)

How can I do that?

like image 873
Thaw De Zin Avatar asked Mar 18 '20 03:03

Thaw De Zin


People also ask

What is the purpose of view binding?

View binding is a feature that allows you to more easily write code that interacts with views. Once view binding is enabled in a module, it generates a binding class for each XML layout file present in that module.

Should I use view binding?

ViewBinding is always null safe and type-safe, which supports both Java and Kotlin. ViewBinding is introduced in the Gradle version 3.6 and above (which comes with the Android Studio 4.0, only gradle 3.6). ViewBinding also helps to reduce the boilerplate code, hence reducing the code redundancy.

What is popUpToInclusive?

app:popUpToInclusive="true"/> </fragment> </navigation> When the navigation graph is inflated, these actions are parsed, and corresponding NavAction objects are generated with the configurations defined in the graph. For example, action_b_to_a is defined as navigating from destination b to destination a .

What is the use of view binding?

View binding is a feature that allows you to more easily write code that interacts with views. Once view binding is enabled in a module, it generates a binding class for each XML layout file present in that module.

How do I bind a view to a module?

If view binding is enabled for a module, a binding class is generated for each XML layout file that the module contains. Each binding class contains references to the root view and all views that have an ID. The name of the binding class is generated by converting the name of the XML file to Pascal case and adding the word "Binding" to the end.

What is the difference between view binding and traversing?

It traverses, creates fragment, creates views and throw an exception. View binding just generates a binding class with all the views of your layout in it. It is not meant for finding the navigation controller of the app. Show activity on this post.

What is view binding in Android jetpack?

View Binding Part of Android Jetpack. View binding is a feature that allows you to more easily write code that interacts with views. Once view binding is enabled in a module, it generates a binding class for each XML layout file present in that module.


1 Answers

You can't replace it with View Binding. findNavController does more than finding the view in the layout.

Have a look at the source code here

/**
* Find a {@link NavController} given a local {@link Fragment}.
*
* <p>This method will locate the {@link NavController} associated with this Fragment,
* looking first for a {@link NavHostFragment} along the given Fragment's parent chain.
* If a {@link NavController} is not found, this method will look for one along this
* Fragment's {@link Fragment#getView() view hierarchy} as specified by
* {@link Navigation#findNavController(View)}.</p>
*
* @param fragment the locally scoped Fragment for navigation
* @return the locally scoped {@link NavController} for navigating from this {@link Fragment}
* @throws IllegalStateException if the given Fragment does not correspond with a
* {@link NavHost} or is not within a NavHost.
*/
@NonNull
public static NavController findNavController(@NonNull Fragment fragment) {
Fragment findFragment = fragment;
while (findFragment != null) {
    if (findFragment instanceof NavHostFragment) {
        return ((NavHostFragment) findFragment).getNavController();
    }
    Fragment primaryNavFragment = findFragment.getParentFragmentManager()
            .getPrimaryNavigationFragment();
    if (primaryNavFragment instanceof NavHostFragment) {
        return ((NavHostFragment) primaryNavFragment).getNavController();
    }
    findFragment = findFragment.getParentFragment();
}
// Try looking for one associated with the view instead, if applicable
View view = fragment.getView();
if (view != null) {
    return Navigation.findNavController(view);
}
throw new IllegalStateException("Fragment " + fragment
        + " does not have a NavController set");
}

It does more than just finding the controller. It traverses, creates fragment, creates views and throw an exception.

View binding just generates a binding class with all the views of your layout in it. It is not meant for finding the navigation controller of the app.

like image 154
Somesh Kumar Avatar answered Oct 18 '22 06:10

Somesh Kumar