Теперь я знаю, что это, вероятно, то, что работает для меня, поэтому я все равно приму другой ответ, и потому что он научил меня чему-то, чего я не знал.
Но после некоторой работы способ, которым я справился, был таким:
Фрагмент, который прикреплен, выглядит так:
class Child : Fragment() {
private var parent: ChildInteraction? = null
override fun onAttach(context: Context?) {
super.onAttach(context)
//this should throw an exception if it is not implemented correctly
parent = (context as LogicProvider).logic!! as Child.ChildInteraction
}
private fun userInteraction() {
parent!!.askStuff()
}
interface ChildInteraction {
fun askStuff():Unit
}
}
Тогда у меня есть LogicProvider
интерфейс, подобный этому:
interface LogicProvider {
val logic: Any?
}
и тогда родитель будет реализовывать логические провайдеры, которые будут передавать аргументы
class ParentActivity : AppCompatActivity(), LogicProvider {
override var logic: Logic? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var frag: Fragment? = supportFragmentManager.findFragmentByTag("parent_logic")
if (frag == null) {
frag = Logic()
supportFragmentManager.beginTransaction().add(frag, "parent_logic").commitNow()
}
logic = frag as Logic
}
override fun onPause() {
super.onPause()
if (isFinishing)
supportFragmentManager.beginTransaction().remove(supportFragmentManager.findFragmentByTag("parent_logic")).commitNow()
}
}
таким образом, логический фрагмент является единственным, который должен реализовывать интерфейсы
class Logic : Fragment(), Child.ChildInteraction, Child2.ChildInteraction2 {
override fun askStuff() {
//do stuff here
}
override fun askStuff2() {
//do other stuff here
}
}