从活动向片段发送数据-如何?

时间:2019-01-08 07:13:37

标签: android android-fragments

案例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种情况与您推荐哪种情况有什么区别?

在这种简单的情况下,您是否认为创建捆绑包是开销吗?

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)
    }
}

我希望它对您有用