Android 从导航抽屉中检索片段
我目前正在尝试实例化导航抽屉中的片段。问题是,在过去,我能够通过以下方式做到这一点:Android 从导航抽屉中检索片段,android,android-studio,android-fragments,Android,Android Studio,Android Fragments,我目前正在尝试实例化导航抽屉中的片段。问题是,在过去,我能够通过以下方式做到这一点: MyFragment fragment = getSupportFragmentManager().findFragmentByid(R.id.fragmentId); 但现在在AndroidX支持库中,整个事情都改变了,现在我不知道如何从NavController、NavigationUI或其他什么检索片段。我需要实例化我的片段,以便在MainActivity中的片段上实现接口,以便在它们之间进行通信 我正
MyFragment fragment = getSupportFragmentManager().findFragmentByid(R.id.fragmentId);
但现在在AndroidX支持库中,整个事情都改变了,现在我不知道如何从NavController、NavigationUI或其他什么检索片段。我需要实例化我的片段,以便在MainActivity中的片段上实现接口,以便在它们之间进行通信
我正在使用Android Studio 3.5.1中的NavigationDrawer活动模板首先,请确保您的所有片段现在都位于Android X的最新库中。稍后,请使用下一步:
MyFragment fragment = getFragmentManager()
.findFragmentByid(R.id.fragmentId);
使用导航和
NavHostFragment
时,片段是布局中NavHostFragment
的子片段
Fragment navHostFragment = getSupportFragmentManager().findFragmentById(
R.id.nav_host_fragment); // Whatever your ID in your layout is
FragmentManager childFragmentManager = navHostFragment.getChildFragmentManager();
// Now you can get your Fragment from the childFragmentManager
MyFragment fragment = childFragmentManager.findFragmentByid(R.id.fragmentId);
但是,在导航世界中,向片段传递接口的推荐模式是通过构造函数注入,使用FragmentFactory
,如下所述:
通过使用
FragmentFactory
,配置更改后的重新创建和初始创建以相同的方式处理。它还允许您使用FragmentScenario
(它采用FragmentFactory
)当使用getFragmentManager()时,容器不是一个Framelayout,而是一个框架;我得到了错误不兼容的数据类型。我通过使用共享视图模型,而不是使用接口,解决了片段通信的问题。我认为将活动排除在交流之外一点也不坏,并且节省了我的时间和编码。我遵循了POST中的示例,通过使用共享视图模型设置片段之间的通信,这似乎是一个很好的方法
// Create an interface for what methods you want to expose
interface Callback {
// whatever methods you want
}
// Change your Fragment to take in that interface
class MyFragment(val callback: Callback) : Fragment() {
// Now your Fragment always has a reference to the Callback
}
private class MyActivityFactory(
callback: Callback
) : FragmentFactory() {
override fun instantiate(
classLoader: ClassLoader,
className: String
) = when (className) {
MyFragment::class.java.name -> MyFragment(callback)
else -> super.instantiate(classLoader, className)
}
}
// Now update your MyActivity to implement the interface
// and pass itself into an instance of the FragmentFactory you created
class MyActivity : AppCompatActivity(), Callback {
override fun onCreate(savedInstanceState: Bundle?) {
supportFragmentManager.fragmentFactory =
MyActivityFactory(this)
super.onCreate(savedInstanceState)
...
}
}