将数据从Activity发送到Fragment - 如何?

问题描述 投票:-2回答:2

案例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个案例有什么区别,你推荐哪一个?

难道你不认为在这个简单的场景中创建一个包是开销吗?

android android-fragments
2个回答
1
投票

两种情况之间的区别:

案例1:屏幕旋转后捆绑信息不会丢失。重新创建FragmentA时,它会再次从捆绑包中接收数据,因此您仍然拥有所需的数据。

案例2:当您旋转设备的屏幕时,片段被销毁,然后由android重新创建。因此,旋转后FragmentA.propertyForKey1的内容将丢失。

所以不,这不是开销,这是必要的。而且我认为在尝试重新发明轮子之前,最好从本机API中获取最佳效果。


0
投票

如果要将数据发送到Activity中的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)
    }
}

我希望这个对你有用

© www.soinside.com 2019 - 2024. All rights reserved.