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)
        ...
    }
}