Można użyć jednego prezentera dla tej sprawy.
Użyj swojego prezentera aktywności, aby uzyskać wszystkie dane potrzebne Twoim fragmentom. następnie utwórz klasę interfejsu i zaimplementuj ją do swoich fragmentów.
Na przykład:
Tworzenie interfejsu publicznego dla PageAFragment (ten interfejs będzie most danych z działalności na fragment). i użyj metody swojego interfejsu, aby obsłużyć wynik twojego prezentera do obejrzenia.
To jest przykład klasy interfejsu, którą utworzyłem dla otrzymanych danych. Parametr, który można wybrać, zależy od potrzeb, ale ja wybieram model.
public interface CallbackReceivedData {
void onDataReceived(YourModel model);
}
W główną działalność Class czeku wystąpienie fragmentu, który przywiązany do swojej działalności. wstaw swoją instancję sprawdzającą po zatwierdzeniu fragmentu.
public class MainActivity extends AppCompatActivity{
private CallbackReceivedData callbackReceivedData;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//after commit the fragment
if (fragment instanceof PageAFragment){
callbackReceivedData = (CallbackReceivedData)fragment;
}
}
//this is the example method of MainActivity Presenter,
//Imagine it, as your view method.
public void receivedDataFromPresenter(YourModel model){
callbackReceivedData.onDataReceived(model);
}
}
Przypuszczałem, że receivedDataFromPresenter jest odbierany sposób naszym zdaniem i uzyskać dane do prezentera.
A teraz będziemy przekazywać dane z prezenterem do callbackReceivedData
W PageAFragment wdrożenia CallbackReceivedData i zastąpić onDataReceived metody. Teraz możesz przekazać dane z działania do twojego fragmentu.
public class PageAFragment extends Fragment implements CallbackReceivedData{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onDataReceived(YourModel model) {
}
}
Uwaga: Alternatywny sposób można użyć Bundle i przekazywać dane z wykorzystaniem setArguments.
Jeśli chcesz wysłać wydarzenie od Fragment do działalności, możesz postępować zgodnie z tym pomysłem.
Utwórz klasę interfejsu i zaimplementuj ją do swojej Głównej Aktywności i Zastąp metodę od interfejsu do aktywności, dla Mojej sprawy robię to w ten sposób.
Oto moja CallbackSendData klasa.
public interface CallbackSendData {
void sendDataEvent(String event);
}
Wdrożenie CallbackSendData interfejs do główną działalność i zastąpić sendDataEvent metody.
public class MainActivity extends AppCompatActivity implements CallbackSendData{
private CallbackReceivedData callbackReceivedData;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//after commit the fragment
if (fragment instanceof PageAFragment){
callbackReceivedData = (CallbackReceivedData)fragment;
}
}
//this is the example method of MainActivity Presenter,
//Imagine it, as your view method.
public void receivedDataFromPresenter(YourModel model){
callbackReceivedData.onDataReceived(model);
}
@Override
public void sendDataEvent(String event){
//You can now send the data to your presenter here.
}
}
I do PageAFragment trzeba użyć metody dołączyć do oddać swój interfejs. Metoda attach zostaje wywołana, gdy fragment zostanie powiązany z jego działaniem. Jeśli chcesz zrozumieć cykl życia fragmentu, kliknij ten link: https://developer.android.com/reference/android/app/Fragment.html.
public class PageAFragment extends Fragment implements CallbackReceivedData{
private CallbackSendData callbackSendData;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onDataReceived(YourModel model) {
//Received the data from Activity to Fragment here.
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup
container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.PagerAFragment, container,
false);
}
@Override
public void onViewCreated(View view, @Nullable Bundle
savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Button Eventbutton;
Eventbutton = view.findViewById(R.id.event_button);
Eventbutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
callbackSendData.sendDataEvent("send Data sample");
}
});
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
try{
callbackSendData = (CallbackSendData) context;
}catch (ClassCastException e){
e.printStackTrace();
}
}
}
I teraz można użyć CallbackSendData wysłać dane z działalności do fragmentu.
Uwaga: Jest znacznie łatwiej, jeśli używasz Dependency Injection do projektu, możesz użyć biblioteki Dagger2.
Goodluck.
Czy możesz podać więcej szczegółów na temat swojego przypadku użycia? ponieważ istnieje kilka możliwych odpowiedzi w różnych przypadkach użycia, takich jak: tworzenie uniwersalnej reguły biznesowej, zastrzyk zależności, używanie magistrali zdarzeń, przekazywanie pakietów do fragmentów itp. –
Czy możesz wymienić przykłady danych/zdarzeń, które chcesz przekazać między prezenterami ? Czy to na przykład wspólne źródło danych? – elmorabea