Код B все еще должен работать нормально.
Я просмотрел findNavController()
. Это функция расширения для упрощения кода, код функции расширения:
fun Activity.findNavController(@IdRes viewId: Int): NavController =
Navigation.findNavController(this, viewId)
Теперь, глядя на код findNavController()
внутри Navigation
, мы видим ниже
@NonNull
public static NavController findNavController(@NonNull Activity activity, @IdRes int viewId) {
View view = ActivityCompat.requireViewById(activity, viewId);
NavController navController = findViewNavController(view);
if (navController == null) {
throw new IllegalStateException("Activity " + activity
+ " does not have a NavController set on " + viewId);
}
return navController;
}
ViewId, который мы передаем в аргументе, используется в первой строке
View view = ActivityCompat.requireViewById(activity, viewId);
теперь глядя на requireViewById()
внутри ActivityCompat
мы видим
@NonNull
public static <T extends View> T requireViewById(@NonNull Activity activity, @IdRes int id) {
if (Build.VERSION.SDK_INT >= 28) {
return activity.requireViewById(id);
}
T view = activity.findViewById(id);
if (view == null) {
throw new IllegalArgumentException("ID does not reference a View inside this Activity");
}
return view;
}
для api 28 и плюс вызывается метод
@NonNull
public final <T extends View> T requireViewById(@IdRes int id) {
T view = findViewById(id);
if (view == null) {
throw new IllegalArgumentException("ID does not reference a View inside this Activity");
}
return view;
}
. Так что, пока представление (внутри которого присутствует nav_host_fragment
) прикреплено к активности, код, который вы написали для поиска контроллера навигации, должен работать полностью нормально.
class TasksActivity : AppCompatActivity() {
private lateinit var binding: TasksActBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = TasksActBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view) //you are attaching view to activity here , make sure you always call this before the next line , else you will get IllegalStateException
val navController: NavController = findNavController(R.id.nav_host_fragment)
}
}
Я не тестировал код лично, но, насколько я понимаю, он должен работать отлично.