Показать фрагмент из модуля динамических функций в базовом (приложении) модуле?

В моем базовом модуле (приложении) есть несколько фрагментов. Я хотел бы поместить один из них в модуль динамических функций, который будет устанавливаться по запросу. Пока пользователь не решит установить этот модуль, я бы просто показал пустой заполнитель вместо этого фрагмента. Я знаю, что это просто, если это Activity из модуля динамических функций, но мне действительно нужно показать этот фрагмент в моем базовом модуле Activity.

Это возможно?


person c0dehunter    schedule 12.08.2020    source источник


Ответы (2)


Вы можете использовать этот способ (Котлин)

// example
val className: String
    get() = "$MODULE_PACKAGE.ui.login.LoginFragment"

fun instantiateFragment(className: String) : Fragment? {
    return try {
        Class.forName(className).newInstance() as Fragment
    } catch (e: Exception) {
        // not install feature module
        null
    }
}
person Công Hải    schedule 12.08.2020
comment
Я думаю, вам нужно обязательно добавить правило сохранения в pro-guard для этого класса, чтобы избежать запутывания - person Ahmed na; 24.02.2021
comment
Если ваш фрагмент используется где-то в коде внутри модуля, вам не нужно добавлять правило сохранения, которое уже соблюдается программой proguard. Если это неиспользуемый Фрагмент внутри модуля, вы должны это сделать. - person Công Hải; 24.02.2021

Чтобы разрешить взаимодействие между модулем приложения и функциональными модулями, one can use dependency injection or service locator pattern. Приложение может найти класс реализации функционального модуля и invokes its public API which returns the fragment instance in the app module and load that in main Activity's container.

например: создайте интерфейс Feature в приложении и соответствующий Impl в функциональном модуле. Затем найдите / вставьте этот экземпляр класса Impl и вызовите его функцию, чтобы получить ссылку на фрагмент.

person Amritpal Singh    schedule 07.09.2020