viewPager 的数据传输,kotlin

大家好我现在试试在main activity创建一个 viewPager2 包括三个fragment ScaleFragment RotateFragment TranslateFragment 。 其中我想从RotateFragment 输入数据并通过button传数据给ScaleFragment 但是通过尝试多变仍然是null ,不能实现。这是我的代码。希望最快能得到你们的解答。

img

img

img

img

很简单啊,
在activity中创建一个全局变量来保存数据,然后在a碎片中把这个数据传给activity,跳转到b碎片的时候b碎片onresume的时候去获取activity中的值即可。


您可以通过以下步骤来实现在RotateFragment中输入数据,并通过按钮将其传递到ScaleFragment:

在RotateFragment中创建一个EditText并为其设置id,以便在代码中使用。例如:

xml
<EditText
    android:id="@+id/edit_text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />
在RotateFragment中创建一个Button并为其设置id和OnClickListener。 在OnClickListener中,获取编辑文本的内容并使用Bundle将其作为参数放入Intent中。例如:

java
Button button = view.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        String editTextContent = editTextView.getText().toString();
        Intent intent = new Intent(getActivity(), ScaleFragment.class);
        Bundle bundle = new Bundle();
        bundle.putString("editTextContent", editTextContent);
        intent.putExtra("bundle", bundle);
        startActivity(intent);
    }
});
在ScaleFragment中,在onCreateView方法中获取从RotateFragment传递的Bundle参数,并从中获取EditText内容。 例如:

java
Bundle bundle = getActivity().getIntent().getBundleExtra("bundle");
if (bundle != null && bundle.getString("editTextContent") != null) {
    String editTextContent = bundle.getString("editTextContent");
    // Use the editTextContent as needed.
}
现在,当用户在RotateFragment中输入文本并单击按钮时,该文本将作为参数传递到ScaleFragment,并且您可以按照需要在ScaleFragment中使用它。

题主,官方有最佳实践。

建议还是优先从官方文档找解决方案

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    我可以给出一些可能的解决方案,希望能够帮到您:

    1. 在RotateFragment和ScaleFragment之间传递数据,您可以使用接口进行实现。在RotateFragment中定义一个接口,然后将接口的实例传递给ScaleFragment。在ScaleFragment中实现接口,以便在RotateFragment中调用。

    这里是示例代码:

    在RotateFragment中定义接口:

    interface OnDataPass { fun onDataPass(data: String) }

    然后,在RotateFragment中找到您想要传递给ScaleFragment的数据,并调用您在OnDataPass接口中定义的方法:

    class RotateFragment : Fragment() {

    private lateinit var onDataPass: OnDataPass
    
    fun setOnDataPassListener(listener: OnDataPass) {
        this.onDataPass = listener
    }
    
    private fun sendData(data: String) {
        onDataPass.onDataPass(data)
    }
    

    }

    在Main Activity中,您需要绑定这个接口,然后将RotateFragment中的接口实例传递给ScaleFragment中的接口实例:

    class MainActivity : AppCompatActivity(), OnDataPass {

    //...
    
    private lateinit var rotateFragment: RotateFragment
    private lateinit var scaleFragment: ScaleFragment
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    
        //...
    
        rotateFragment = RotateFragment()
        scaleFragment = ScaleFragment()
    
        rotateFragment.setOnDataPassListener(this)
        supportFragmentManager.beginTransaction()
            .add(R.id.container, rotateFragment, "rotateFragment")
            .add(R.id.container, scaleFragment, "scaleFragment")
            .hide(scaleFragment)
            .commit()
    
    }
    
    override fun onDataPass(data: String) {
        scaleFragment.updateData(data)
    }
    

    }

    在ScaleFragment中实现OnDataPass接口:

    class ScaleFragment : Fragment(), OnDataPass {

    //...
    
    override fun onDataPass(data: String) {
        updateData(data)
    }
    
    fun updateData(data: String) {
        // Update data in ScaleFragment...
    }
    

    }

    1. 如果您只是想从RotateFragment传递数据给ScaleFragment,您可以使用Bundle对象。在RotateFragment中,创建一个Bundle对象,然后将数据放入Bundle中。接下来,将Bundle对象传递给ScaleFragment,并在ScaleFragment中提取数据。

    这是一个示例代码,其中的数据是字符串类型:

    class RotateFragment : Fragment() {

    //...
    
    private fun sendData(data: String) {
        val bundle = Bundle()
        bundle.putString("data", data)
    
        val scaleFragment = ScaleFragment()
        scaleFragment.arguments = bundle
    
        // Use FragmentManager to replace current fragment with scaleFragment
    }
    

    }

    在ScaleFragment中,您可以使用arguments属性获取RotateFragment传递的数据:

    class ScaleFragment : Fragment() {

    //...
    
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
    
        arguments?.let {
            val data = it.getString("data")
            // Update data in ScaleFragment...
        }
    
    }
    

    }

    希望这些解决方案能够帮到您!


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

以下答案由GPT-4.5Plus大模型(语音)与博主A努力中.......共同编写:

从你的代码来看,有几个可能的问题:

  1. 在RotateFragment中,你是通过Bundle将输入的数据传递给ScaleFragment的。但是在ScaleFragment中,你并没有正确获取这个Bundle。你只是在onCreate中获取了默认的arguments,而不是RotateFragment传递过来的Bundle。

要修复这个问题,你需要在ScaleFragment的onViewCreated中获取由RotateFragment传递过来的Bundle,而不仅仅是默认的arguments:

kotlin
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 
    super.onViewCreated(view, savedInstanceState)
    val bundle = arguments ?: savedInstanceState?.getBundle("bundle_key") 
    // Use bundle to get data from RotateFragment
}

  1. 在RotateFragment向ScaleFragment传值时,你使用的是replace方法。这会导致ScaleFragment被重新创建,之前获取的数据会丢失。

要修复这个问题,你应该使用add方法而不是replace方法:

kotlin
ScaleFragment().arguments = Bundle().apply { addString("key", text1.text.toString()) }
add方法会将数据添加到现有的Bundle中,而不会引起Fragment重新创建,数据就不会丢失。

  1. 你应该指定一个字符串常量作为Bundle的key,而不是直接使用"key"。这会导致键冲突的可能性。

修复方法是:

kotlin 
companion object {
    const val KEY_DATA = "data_key"
}

// 使用KEY_DATA作为Bundle的key
ScaleFragment().arguments = Bundle().apply { addString(KEY_DATA, text1.text.toString()) }

希望这个分析和修复建议能帮助你解决在ViewPager2和Fragment之间传递数据的问题。在Android开发中,理解生命周期和组件间的数据流动是非常重要的。