从 Activity 调用当前可见的 NavHostFragment 方法
Call a current visible NavHostFragment's method from Activity
为了完成这个任务,我目前正在使用 FragmentListner 接口,但我需要使用创建静态方法来获取片段的实例。为了避免这种静态方式,我在想是否有更好的方法来做到这一点。我需要在 Activity 上获取当前可见的片段实例,并基于此我需要调用该片段的方法。
如果它不是 NavHost 片段,我很容易得到像下面这样的片段实例,并且可以从中调用任何 public 方法。
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;
}
}
});
这里我们可以通过目标id知道可见片段,有什么可以return直接我们可见片段实例吗??
问题好像有点不清楚,请问您使用的是导航组件吗?
如果是这样,那就太简单了:只需添加一个 navController.addOnDestinationChangeListener()
,您将始终知道 activity 中的当前 Fragment
。
如果没有,您可以使用 findLast
from supportFragmentManager
:
supportFragmentManager.fragments.findLast { fgm -> //fragment that is currently on top }
您可以使用 NavHostFragment
通过其 childFragmentManager
获得 primaryNavigationFragment
。
val navHostFragment = supportFragmentManager.findFragmentById(R.id.your_nav_host_fragment_id) as NavHostFragment
val currentFragment = navHostFragment.childFragmentManager.primaryNavigationFragment
看看这是否适合你!
为了完成这个任务,我目前正在使用 FragmentListner 接口,但我需要使用创建静态方法来获取片段的实例。为了避免这种静态方式,我在想是否有更好的方法来做到这一点。我需要在 Activity 上获取当前可见的片段实例,并基于此我需要调用该片段的方法。
如果它不是 NavHost 片段,我很容易得到像下面这样的片段实例,并且可以从中调用任何 public 方法。
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;
}
}
});
这里我们可以通过目标id知道可见片段,有什么可以return直接我们可见片段实例吗??
问题好像有点不清楚,请问您使用的是导航组件吗?
如果是这样,那就太简单了:只需添加一个 navController.addOnDestinationChangeListener()
,您将始终知道 activity 中的当前 Fragment
。
如果没有,您可以使用 findLast
from supportFragmentManager
:
supportFragmentManager.fragments.findLast { fgm -> //fragment that is currently on top }
您可以使用 NavHostFragment
通过其 childFragmentManager
获得 primaryNavigationFragment
。
val navHostFragment = supportFragmentManager.findFragmentById(R.id.your_nav_host_fragment_id) as NavHostFragment
val currentFragment = navHostFragment.childFragmentManager.primaryNavigationFragment
看看这是否适合你!