#android #android-fragments #android-activity #android-fragmentactivity #android-jetpack-navigation
Вопрос:
Для выполнения этой задачи я в настоящее время использую интерфейс FragmentListner, но мне нужно использовать метод create a static, чтобы получить экземпляр фрагмента. Чтобы избежать такого подхода статического способа, я думаю, есть ли какой-нибудь лучший способ сделать это. Мне нужно получить текущий экземпляр видимого фрагмента в действии, и на основе этого мне нужно вызвать метод этого фрагмента.
Если это не фрагмент NavHost, я легко получаю экземпляр фрагмента, подобного приведенному ниже, и могу вызвать из него любой общедоступный метод.
Fragment fragment = getCurrentFragment();
if (fragment instanceof MyFragment) {
((MyFragment) fragment).doFragmentOperation();
}
private Fragment getCurrentFragment() {
return this.getSupportFragmentManager()
.findFragmentById(R.id.framelayout);
}
Но я могу узнать, какой фрагмент виден с помощью метода addOnDestinationChangedLisnter, как показано ниже
navController.addOnDestinationChangedListener(new NavController.OnDestinationChangedListener() {
@Override
public void onDestinationChanged(@NonNull NavController controller, @NonNull NavDestination destination, @Nullable Bundle arguments) {
switch (destination.getId()) {
case R.id.navigation_x:
Toast.makeText(this, "X fragment is visible", Toast.LENGTH_SHORT).show();
break;
case R.id.navigation_y:
Toast.makeText(this, "Y fragment is visible", Toast.LENGTH_SHORT).show();
break;
case R.id.navigation_z:
Toast.makeText(this, "Z fragment is visible", Toast.LENGTH_SHORT).show();
break;
}
}
});
Здесь мы можем узнать видимый фрагмент по идентификатору назначения, есть ли что-нибудь, что может вернуть нам экземпляр видимого фрагмента напрямую??
Ответ №1:
Вы можете использовать NavHostFragment
его, чтобы получить primaryNavigationFragment
childFragmentManager
его с помощью .
val navHostFragment = supportFragmentManager.findFragmentById(R.id.your_nav_host_fragment_id) as NavHostFragment
val currentFragment = navHostFragment.childFragmentManager.primaryNavigationFragment
Посмотрите, сработает ли это для вас!
Комментарии:
1. Да, это действительно сработало для меня. Спасибо
Ответ №2:
Вопрос кажется немного неясным, используете ли вы навигационные компоненты?
Если это так, то это слишком просто: просто добавьте navController.addOnDestinationChangeListener()
, и вы всегда будете знать текущую Fragment
активность.
Если нет, вы можете использовать findLast
из supportFragmentManager
:
supportFragmentManager.fragments.findLast { fgm -> //fragment that is currently on top }
Комментарии:
1. Эй, я использую NavController.addOnDestinationChangeListener (), но там мы можем узнать видимый фрагмент по идентификатору назначения, есть ли что-нибудь, что может вернуть нам экземпляр видимого фрагмента напрямую?? Я отредактировал вопрос, пожалуйста, посмотрите
2. как только вы его получите, просто попросите
findFragmentById(id)
, и все будет в порядке. Не уверен, что это вернет, но я уверен, что вы можете, по крайней мере, применить это к своему фрагменту3. Нет, это не сработало