2017-06-22 1 views
1

In activityA habe ich ein listview, von denen jedes ein benutzerdefiniertes Parcelable Objekt ist. Auf listViewItemClick zeigen, dass ich ein fragment mit zwei Argumenten, die ich in bundle mit dieser Methode setzen:Bündel returns lang anstelle von Parcelable

public void openFragment(CustomParcelable parcelableObject, long objectID) { 
    FragmentA fragmentA = new FragmentA(); 
    Bundle bundle = new Bundle(); 
    bundle.putParcelable(FragmentA.KEY, parcelableObject); 
    bundle.putLong(FragmentA.KEY, objectID); 
    fragmentA.setArguments(bundle); 
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
    transaction.replace(R.id.fragmentContainer, fragmentA); 
    transaction.commitAllowingStateLoss(); 
} 

In FragmentA ich die ausgewählte benutzerdefinierte Parcelable Objekt verwenden müssen, damit ich es in onCreate vom bundle wie diese:

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Bundle bundle = this.getArguments(); 

    currentObject = bundle.getParcelable(KEY); 
    objectID = bundle.getLong(KEY); 

    ... 
} 

Hinweis: currentObject ein privates CustomParcelable im fragment definiert, objectID ist ein privater definiert lange in den fragment, KEY ist public final string definieren d in der fragment.

Wenn ich CurrentObject später in einer meiner Methoden verwende, gibt es NPE zurück, da CurrentObject Null ist. Beim Debuggen zeigt es, dass es die Parcelable bekommt, aber mit dem Wert von objectID.

Is the data passed cor Werden die Daten korrekt übergeben? Was bewirkt, dass currentObject gleich null ist?

+1

löscht Warum sind Sie denselben Schlüssel für beide Daten verwendet? Verwenden Sie unterschiedliche Schlüssel für beide Daten – Sanoop

+0

Sollte ich einen anderen Schlüssel verwenden? Wenn ja, warum? –

+1

weil im bundle verwenden wir Schlüsselwertpaar Schema so für zwei verschiedene Werte sollten Sie zwei Schlüssel verwenden – sumit

Antwort

2

Sie müssen für jede Daten einen anderen Schlüssel verwenden. einen Schlüssel und entsprechenden Wert, weil das Bündel Elementname Wert-Paare behandelt wird,

Was Sie getan haben, ist der gleiche Schlüssel für beide Daten verwendet, so dass die ersten Daten bekam durch die zweite lange Daten geschrieben über,

für Beispiel: wenn Sie this wird angegeben, dass für putParcelable

Fügt ein Parcel Wert in die Abbildung dieses Bundle, ersetzt alle vorhandenen Wert für den angegebenen Schlüssel zu sehen. Schlüssel oder Wert können null sein.

Was Sie tun sollten ist

public void openFragment(CustomParcelable parcelableObject, long objectID) { 
    FragmentA fragmentA = new FragmentA(); 
    Bundle bundle = new Bundle(); 
    bundle.putParcelable(FragmentA.KEY1, parcelableObject); 
    bundle.putLong(FragmentA.KEY2, objectID); 
    fragmentA.setArguments(bundle); 
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
    transaction.replace(R.id.fragmentContainer, fragmentA); 
    transaction.commitAllowingStateLoss(); 
} 

und in fragmenta

currentObject = bundle.getParcelable(KEY1); 
objectID = bundle.getLong(KEY2); 

Hoffnung dies Ihr Zweifel

+0

Ich sehe, was ich falsch gemacht habe. Danke für die Hilfe, es funktioniert jetzt gut. –

Verwandte Themen