2017-06-20 40 views
0

Ich habe 3 Fragmente. Fragment A, B und C. A haben einen "continue" -Button, der es nach B bringt. B haben einen continue-Button, der es nach C bringt. C habe einen "add" -Button, der es zurück nach B bringt. Jetzt ich möchte Daten von A nach B senden, wenn die Fortfahren-Taste gedrückt wird. und auch von C nach B, wenn die Schaltfläche "Hinzufügen" gedrückt wird. Ich habe versucht, Bündel zu verwenden. Es gibt mir Null-Zeiger-Ausnahme als das erste Mal, wenn von A nach B geht, das Bündel von C ist Null. Wie löst man das? Jede Hilfe wird sehr geschätzt. Bitte gehen Sie durch das Code-Snippet unterKommunikation zwischen 3 Fragmenten

Hinweis: ItemDetails wird von Fragment A und EmployeeDetails von Fragment C erhalten. Fragment Flow => 1. Fragment A 2. A bis B (ElementeListe an B übergeben) 3. B to C (Keine Kommunikation) 4. Zurück zu B von C (Mitarbeiterliste an B übergeben).

String TEMP_STRING_EMPLOYEES, TEMP_STRING_ITEMS; 
EmployeeList employeeList; 
ItemsList itemsList; 

@Override 
public void onStart() { 
    super.onStart(); 
    Bundle args = getArguments(); 
    if (args != null) { 

     TEMP_STRING_ITEMS = args.getString("ItemsDetails"); 

     try { 
      // Set article based on argument passed in 
      TEMP_STRING_EMPLOYEES = args.getString("EmployeeDetails"); 

     } catch (NullPointerException ex) { 

     } 


    } else { 

    } 

} 
//Next lines of code from MAinActivity.java 

@Override public void onFragmentInteractionForEmployeeDetails (Arraylist Arraylist) {

EmployeeList employeeList = new EmployeeList(arrayList); 
    String correspondingJson = NavigationUtils.getStringForObject(employeeList); 

    B newFragment = new B(); 
    Bundle args = new Bundle(); 
    args.putString("EmployeeDetails", correspondingJson); 
    newFragment.setArguments(args); 

    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 

    // Replace whatever is in the fragment_container view with this fragment, 
    // and add the transaction to the back stack so the user can navigate back 
    transaction.replace(R.id.fragment_container, newFragment); 
    transaction.addToBackStack(null); 
    transaction.commit(); 
} 
+0

Werfen Sie einen Blick auf [diese] (https://Stackoverflow.com/a/44008851/6950238) –

+0

Können Sie Ihren Bundle-Code senden und senden? –

+0

Für die Kommunikation zwischen Fragmenten können Sie entweder [über Aktivitäten] (https://developer.android.com/training/basics/fragments/communicating.html) oder folgen Sie [dieser Antwort] (https://stackoverflow.com/ a/36496481/1276636) – Sufian

Antwort

0

Sie können einen Rückruf in dem Fragment verwenden und die Aktivität speichert Ihr Objekt.

Aktivität

public class MyActivity extends Activity implements MyActivityCallback{ 

    private Object myObject; // Replace with your object type 

    @Override 
    public Object getMyObject(){ 
     return myObject; 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     myObject = new Object(); 
     // ... 
    } 

    // .... 
} 

MyActivityCallback

public interface MyActivityCallback{ 
    Object getMyObject(); 
} 

Fragment

private MyActivityCallback mCallback; 

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 

    try { 
     mCallback = (MyActivityCallback) getActivity(); 
    } catch (ClassCastException e) { 
     throw new ClassCastException(context.toString() 
       + " must implement " + MyActivityCallback.class.getSimpleName()); 
    } 
} 

@Override 
public void onDetach() { 
    mCallback = null; 
    super.onDetach(); 
} 

Dann in Ihrem Fr ament, um auf Ihr Objekt zuzugreifen, tun Sie mCallback.getMyObject();

+0

Entschuldigung, aber das beantwortet meine Frage nicht. Ich habe 3 Fragmente und was ich loswerden möchte, ist eine NullPointerException. Das Problem ist mit dem Ablauf der Ausführung. erster Wert von Fragment A kommt. Zu diesem Zeitpunkt ist der Wert von C null. Ich werde den Code posten. Bitte überprüfen Sie –

+0

Das Problem, Ihr Objekt in ein Bündel zu setzen, um es an das nächste Fragment zu senden, ist, dass es Parcelable sein muss, was ein Schmerz in der a ** zu implementieren und zu pflegen ist.Die Verwendung der Aktivität zum Speichern der Daten (oder eines externen Datenmanagers) ist einfacher. Aber ich werde mir deinen Code ansehen, wenn du deinen Beitrag aktualisierst. :) – Eselfar

+0

aktualisiert. Angenommen, ich übergebe nur String-Daten. –

Verwandte Themen