我有一个简单的CalculatorActivity
,其中包含连续显示的片段:
InputFragment //requests two input values for calclation
ResultFragment // show the result of the calculation
为了简单起见,让我们假设,我想计算两个数字的和。我通过以下方式启动CalculatorActivity
,它会立即加载InputFragment
:
fun replaceFragment(resId : Int, newFragment : Fragment){
this.supportFragmentManager?.beginTransaction()?.replace(resId, newFragment)?.addToBackStack(null)?.commit()
}
resId
是要在其中膨胀片段的容器的资源ID。newFragment
是要膨胀的新片段。在第一步中,我调用了CalculatorActivity
的onCreate()
replaceFragment(R.id.container, InputFragment.getInstance())
到目前为止,它工作得很好。
但是,当我在InputFragment
中输入所需的数字时,如何将值从InputFragment
转发回调用CalculatorActivity
,以便它可以继续并将ResultFragment膨胀到完全相同的容器中以显示计算结果?
发布于 2019-03-21 02:13:53
您总是可以从任何片段(通过使用getActivity
)获取封闭的活动,然后将其转换为适当的类型并对其使用您自己的setValues
方法。看看这个:https://developer.android.com/training/basics/fragments/communicating
发布于 2019-03-21 03:40:51
您可以将该值作为活动中的变量,也可以从片段中获取
CalculatorActivity myActivity = (CalculatorActivity)getActivity()
myActivity.setInputValues(fragmentInputValues)
myActivity.doSomethingWithTheValues()
发布于 2019-03-21 04:24:37
如果您正在学习,这只是为了好玩,那么可以直接转换到activity并访问它的公共方法。然而,在现实世界的实践中,我永远不会这样做。
最佳实践是在父活动上使用接口实现。
示例:接口类
interface IBaseActivityCallback {
fun onInputValuesReady(myObjectOfValues: MyObject)
}
活动类
class CalculatorActivity : AppCompatActivity(), IBaseActivityCallback {
override fun onInputValuesReady(myObjectOfValues: MyObject){
//handle inflate or usage of values
}
}
片段类
lateinit var baseActivityCallback: IBaseActivityCallback
override fun onAttach(context: Context) {
super.onAttach(context)
//NOTE* wrap in try/catch if context can be something else
baseActivityCallback = context as IBaseActivityCallback
}
fun someButtonClicked(){
baseActivityCallback.onInputValuesReady(myObjectToPass)
}
我想我不需要解释创建一个对象来保存变量或者被点击的按钮等等。所以我为你保留了这部分的一般性。
https://stackoverflow.com/questions/55267500
复制相似问题