案例1: 我想知道为什么应该使用.setArguments()方法将数据传递给片段?
情况2: 为什么我们不能在片段类中使用简单的公共setter属性?
案例1的示例 :(某种伪代码)
Activty {
FragmentA fa = new FragmentA();
Bundle bundle = new Bundle();
bundle.putString("key_1", "Hello");
fa.setArguments(bundle);
//begin fragment transistion
}
案例2的示例:
Activty {
FragmentA fa = new FragmentA();
//setter in frgment class
fa.setPropertyForKey_1("Hello");
//begin fragment transistion
}
这2种情况与您推荐哪种情况有什么区别?
在这种简单的情况下,您是否认为创建捆绑包是开销吗?
答案 0 :(得分:1)
两种情况之间的区别:
情况1:屏幕旋转后,捆绑包信息不会丢失。重新创建FragmentA时,它将再次从包中接收数据,因此您仍然拥有所需的数据。
情况2:旋转设备屏幕时,Fragment被销毁,然后由android重新创建。因此,旋转后丢失了FragmentA.propertyForKey1的内容。
所以不,这没有开销,这是必要的。而且我认为最好在尝试重新发明轮子之前充分利用本地API。
答案 1 :(得分:0)
如果要从Activity将数据发送到Fragment,最好的方法是创建到Fragment的实例。您可以以此代码为例;
片段;
class SampleFragment: Fragment{
companion object {
const val KEY_DATA = "data"
const val KEY_OTHER_DATA = "other_data"
fun instance(data:String, otherData:Int): SampleFragment {
val fragment = SampleFragment()
val bundle = Bundle()
bundle.putString(KEY_DATA,data)
bundle.putInt(KEY_OTHER_DATA,otherData)
fragment.arguments = bundle
return fragment
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val data = arguments.getString(KEY_DATA)
val otherData = arguments.getInt(KEY_OTHER_DATA)
}
}
活动;
class SampleActivity: AppCompatActivity() {
@Override
protected void onCreate(Bundle savedInstanceState) {
val sampleFragment = SampleFragment.instance("data",0)
}
}
我希望它对您有用