為了實作這個任務,我目前正在使用一個FragmentListner介面,但我需要使用創建靜態方法來獲取片段的實體。為了避免這種靜態方式,我在想是否有更好的方法來實作。我需要在Activity上獲得當前可見的片段實體,并在此基礎上呼叫該片段的一個方法。
如果它不是一個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。
}
}
});
在這里,我們可以通過目標ID知道可見的片段,有沒有什么東西可以直接回傳給我們可見片段的實體?
uj5u.com熱心網友回復:
這個問題似乎有點不清楚,你在使用導航組件嗎?
如果是的話,那就太簡單了:只要添加一個navController.addOnDestinationChangeListener(),你就會一直知道活動中當前的Fragment。
如果沒有,你可以使用supportFragmentManager的findLast:
supportFragmentManager.fragments.findLast { fgm -> //fragment that is currently on top }
uj5u.com熱心網友回復:
你可以使用NavHostFragment來獲得primaryNavigationFragment使用其childFragmentManager。
val navHostFragment = supportFragmentManager.findFragmentById(R.id.your_nav_host_fragment_id) as NavHostFragment
val currentFragment = navHostFragment.childFragmentManager.primaryNavigationFragment
看看這是否對你有用!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/318376.html
標籤:
