不使用接口的碎片之间的通信

时间:2017-02-06 20:22:51

标签: java android android-fragments

我试图在两个片段之间进行通信,但我只是一个初学者,所以我想知道是否有任何解决方案没有使用interface ....

如果有片段A,B及其活动:

  1. 将值从片段A发送到活动 (在这里,片段A是当前状态)
  2. 将值从活动发送到片段B
  3. 我知道两个片段之间的直接通信几乎是不可能的, 但我认为这不会让我使用interface

    此外,是否有任何方法可以使用putExtra()作为片段?我只知道使用Serializable

5 个答案:

答案 0 :(得分:1)

您可以使用EventBus直接在片段之间进行通信 - 通过一个片段发送普通或粘性事件,并在另一个片段中订阅该事件。 如果不希望消息丢失,请使用粘性事件 - 它在Android中用作粘性Intent。它将会被targer片段删除,或者因为另一个事件正在等待。

答案 1 :(得分:1)

查看Android deverlopers页面:http://developer.android.com/training/basics/fragments/communicating.html#DefineInterface

基本上,您在Fragment A中定义了一个接口,并让您的Activity实现该接口。现在,您可以调用Fragment中的接口方法,并且您的Activity将接收该事件。现在,在您的活动中,您可以调用第二个片段以使用收到的值

更新文本视图
  // You Activity implements your interface
  public class YourActivity implements FragmentA.TextClicked{
@Override
public void sendText(String text){
    // Get Fragment B
    FraB frag = (FragB)
        getSupportFragmentManager().findFragmentById(R.id.fragment_b);
    frag.updateText(text);
  }
}


// Fragment A defines an Interface, and calls the method when needed
public class FragA extends Fragment{

TextClicked mCallback;

public interface TextClicked{
    public void sendText(String text);
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

    // This makes sure that the container activity has implemented
    // the callback interface. If not, it throws an exception
    try {
        mCallback = (TextClicked) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString()
            + " must implement TextClicked");
    }
}

public void someMethod(){
    mCallback.sendText("YOUR TEXT");
}

@Override
public void onDetach() {
    mCallback = null; // => avoid leaking, thanks @Deepscorn
    super.onDetach();
    }
     }

    // Fragment B has a public method to do something with the text
 public class FragB extends Fragment{

public void updateText(String text){
    // Here you have it
  }
}

答案 2 :(得分:0)

你可以从父活动类调用一个方法来调用片段B中的方法,如((YourActivity)getActivity()).callMethod(T yourData)

答案 3 :(得分:0)

是的,您可以使用bundle在片段之间传输数据,就像使用putExtra

中的活动一样
        Bundle = bundle = new Bundle();
        bundle.putString("key","value");
        bundle.putSerializable("serialzedKey",SerializedValue);
        FragmentTransaction fts = ((BaseActivity) mContext).getSupportFragmentManager().beginTransaction();
        fragment.setArguments(bundle);
        fts.add(R.id.fragmentHolder, fragment);
        fts.addToBackStack(fragment.getClass().getSimpleName());
        fts.commit();

在其他片段中,您可以使用getArguments()

检索数据
 String key = getArguments().getString("key");
SerializedModel = getArguments().getSerializable("serialzedKey");

答案 4 :(得分:0)

看看我的Github回购使用接口在片段之间进行通信。

这只是一个非常简单的例子,但显示了关键概念。

https://github.com/stoddayy/FragmentInteractionExample