如何通过JetPack的Navigation组件在托管片段的Activity中调用导航片段的功能?

时间:2019-12-11 03:58:21

标签: android android-fragments android-jetpack android-jetpack-navigation

我从FragmentManager的事务切换到JetPack的Navigation体系结构组件。这样做时,我不再可以调用:findFragmentById(int),这样我就可以获得对实例化片段的引用,从而可以从承载它的Activity中调用它的功能。

这样做的原因是,我无法获得自定义的DialogFragment来实现片段本身内部的侦听器,因此我将其在Main Actiity中实现。当DialogFragment进行交互时,我希望它通知该片段以调用某些函数。但是因为我无法在Fragment本身中注册侦听器,所以完全不知道用户单击了“取消”或“确认”按钮。

该活动从DialogFragment知道了用户的操作,因此它应该能够通知Fragment,以便Fragment可以调用其功能。

如何获得对导航片段的引用,以便调用其功能?

2 个答案:

答案 0 :(得分:1)

首先,请检查我对您问题的理解,因为这是我回答的基准:

  1. 您有活动
  2. 它承载片段
  3. 该片段将打开对话框片段,并想知道用户的对话框结果

如果以上内容正确,那么我认为导航当前不支持此类功能,但是您可以:

  1. 使用共享视图模型(例如,在活动级别),该模型具有某种一次性数据,订阅了片段,而对话框片段则发送选择。因此,基本上,当对话片段更改实时数据时,托管片段(或任何其他订阅者)会自动接收更改
  2. 使用普通的旧事件总线(如Otto)并仅在片段级别订阅事件并在对话框片段内发出事件?

PS .:这里可能是一次数据结构:

class OneTimeLiveData<T> : MutableLiveData<T>() {

    private val pending = AtomicBoolean(false)

    override fun observe(owner: LifecycleOwner, observer: Observer<in T>) {
        super.observe(owner, Observer { t ->
            if (pending.compareAndSet(true, false)) {
                observer.onChanged(t)
            }
        })
    }

    @MainThread
    override fun setValue(t: T?) {
        pending.set(true)
        super.setValue(t)
    }

    @MainThread
    fun call() {
        value = null
    }
}

答案 1 :(得分:0)

我只需要在与导航组件一起使用的应用程序中从活动的片段中调用该函数。我这样称呼下面的代码。

val searchFragment = supportFragmentManager.fragments[0].childFragmentManager.fragments[0] as SearchFragment
searchFragment.setSearchText(obj.getOriginalValue())