当前位置: 首页 > 知识库问答 >
问题:

如何将数据从一个片段传输到另一个片段android

张岳
2023-03-14

我知道的一种方法是通过活动。我们可以将数据从一个片段发送到另一个活动,再从一个活动发送到另一个片段。还有其他方法吗?

共有3个答案

高宏峻
2023-03-14

我认为有两种方法可行:

A、 与您所属的活动进行通信,并通过该所属活动将消息转发给其他片段,有关详细信息,请参阅以下android官方文档:

http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity

引述:

在某些情况下,您可能需要一个片段来与活动共享事件。这样做的一个好方法是在片段内定义回调接口,并要求宿主活动实现它。当活动通过接口接收到回调时,它可以根据需要与布局中的其他片段共享信息。

通信界面可以如下所示:

public interface IActionListener{

  //You can also add parameters to pass along etc
  public void doSomething();
}

片段看起来像这样:

public class MyFragment extends Fragment{

private WeakReference<IActionListener> actionCallback;

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            // This makes sure that the container activity has implemented
            // the callback interface. If not, it throws an exception
            actionCallback = new WeakReference<IActionListener>((IActionListener) activity);
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement IActionListener.");
        }
    }
}

我在这里使用的是一个弱引用,但这实际上取决于你。您现在可以使用actionCallback与拥有的活动进行通信,并调用IActionListener中定义的方法。

拥有的活动如下所示:

public class MyActivity extends ActionBarActivity implements IActionListener {

public void doSomething(){ //Here you can forward information to other fragments }

}

B.现在对于第二种方法——您也可以让片段使用接口直接相互通信——这样您就不必知道您正在交谈的片段的确切类别,这确保了松散耦合。

设置如下:您有两个片段(或更多)和一个活动(启动第二个片段)。我们有一个接口,可以让片段2在完成任务后向片段1发送响应。为了简单起见,我们只是重用我在A中定义的接口。

这是我们的片段1:

public class FragmentOne extends Fragment implements IActionListener {

 public void doSomething() {//The response from Fragment 2 will be processed here}

}

使用A中描述的方法。片段1要求它拥有活动来启动片段2。但是,活动将把片段1作为参数传递给片段2,因此片段2稍后可以间接访问片段1并发送回复。让我们看看活动如何准备片段2:

    public class MyActivity extends ActionBarActivity {

    // The number is pretty random, we just need a request code to identify our request later
    public final int REQUEST_CODE = 10;
    //We use this to identify a fragment by tag
    public final String FRAGMENT_TAG = "MyFragmentTag";

        @Override
        public void onStartFragmentTwo() {
            FragmentManager manager = getSupportFragmentManager();
            FragmentTransaction transaction = manager.beginTransaction();

                    // The requesting fragment (you must have originally added Fragment 1 using 
                    //this Tag !)
            Fragment requester = manager.findFragmentByTag(FRAGMENT_TAG);   
                    // Prepare the target fragment
            Fragment target = new FragmentTwo();
                    //Here we set the Fragment 1 as the target fragment of Fragment 2's       
                    //communication endeavors
            target.getSelf().setTargetFragment(requester, REQUEST_CODE);

                    // Hide the requesting fragment, so we can go fullscreen on the target
            transaction.hide(requester);
            transaction.add(R.id.fragment_container, target.getSelf(), FRAGMENT_TAG);
            transaction.addToBackStack(null);

            transaction.commit();
        }
    }

提示:我使用的是支持框架,因此如果您只为

现在FragmentTwo正在启动,让我们看看FragmentTwo如何与FragmentOne进行通信:

public class FragmentTwo extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if(savedInstanceState != null){
            // Restore our target fragment that we previously saved in onSaveInstanceState
            setTargetFragment(getActivity().getSupportFragmentManager().getFragment(savedInstanceState, TAG),
                    MyActivity.REQUEST_CODE);           
        }

        return super.onCreateView(inflater, container, savedInstanceState);
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        // Retain our callback fragment, the TAG is just a key by which we later access the fragment
        getActivity().getSupportFragmentManager().putFragment(outState, TAG, getTargetFragment());
    }

    public void onSave(){
        //This gets called, when the fragment has done all its work and is ready to send the reply to Fragment 1
        IActionListener callback = (IActionListener) getTargetFragment();
        callback.doSomething();
    }

}

现在将调用片段1中doSomething()的实现。

司空鸣
2023-03-14

引用文档

通常您会希望一个片段与另一个片段通信,例如根据用户事件更改内容。所有片段到片段的通信都是通过关联的活动完成的。两个片段永远不应该直接通信。

我建议您按照文档中的方法操作,我没有尝试过其他方法

有关更多信息和示例,请访问以下链接中的文档

http://developer.android.com/training/basics/fragments/communicating.html

闾丘炫明
2023-03-14

将数据从一个片段传递到另一个Bundle会有所帮助。

LifeShapeDetailsFragment fragment = new LifeShapeDetailsFragment(); //  object of next fragment
Bundle bundle = new Bundle();
bundle.putInt("position", id);
 fragment.setArguments(bundle);

然后推送/调用下一个Fragments。

并编码到下一个片段:

Bundle bundle = this.getArguments();
int myInt = bundle.getInt("position", 0);
 类似资料:
  • 我有两个活动,在活动1中有碎片,在活动2中有碎片 fragment1和fragment2扩展自FragmentActivity1,activity2扩展自AppCompatActivity 我想将字符串值从fragment1发送到fragment2,而不获取空值。我希望你能理解这个问题。谢谢

  • 在FragmentOne.class扩展android.support.v4.app.

  • 这是我完整的logcat: 在Android.support.v4.app.backStackRecord.doaddop(backStackRecord.java:414)在Android.support.v4.app.backStackRecord.replace(backStackRecord.java:449)在Android.support.v4.app.backStackRecord.

  • 我在一个片段中有一个复选框列表(我们称之为FragmentA),我有一个包含两个片段(FragmentB和C)的活动。如果选中一个复选框,我想在片段C中显示一条消息,说明选中了特定的复选框。我需要帮助,因为我不知道如何将(isChecked)从片段A传递到片段C。 FragmentA.java 分数不影响碎片C。 包含片段 B 和 C 的活动 片段C 活动

  • 先生/女士,我想使用android JAVA将一个片段回调到另一个片段。我试图找到问题,但没有找到解决方案。若我使用接口,它会向活动发送回调响应,这是我不想要的。非常感谢。

  • 我找到了这段代码来将数据从一个片段传递到另一个片段: 片段1: 片段2: 但我不想改变片段。所以我拆了一部分。但这不起作用。这里是我的代码: 片段1: 片段2: 我必须使用我在网上找到的代码还是我的版本也能工作?当我打开第二个片段时会出现这个错误: E/AndroidRuntime:致命异常:主进程:com.example.rexan_snerficonquiz.fragment_score.on