2017-03-14 6 views
0

Ich habe eine Blog-App und ich habe eine harte Zeit mit meinem PostFragment.Fragment/Aktivität Info-Austausch

Wenn der Benutzer einen Beitrag veröffentlicht, kann er ein Gefühl auswählen, indem er auf eine Schaltfläche klickt, die ihn zu einem anderen Fragment mit der Gefühlsliste führt. Sobald er das Gefühl ausgewählt hat, rufe ich popBackStack() auf, um ihn zum vorherigen Bildschirm zu bringen.

Da ich seine Auswahl auf dem PostFragment anzeigen muss, speichere ich diesen Wert in der Aktivität (ich sah diese Technik hier in SO). Dies ist die selectedFeeling Variable Aktivität:

public class FeedActivity extends BaseActivity { 

    Intent intent; 
    Post post; 
    private Feeling selectedFeeling; 

    @Override 
    protected void onCreate(Bundle savedInstanceState){ 
    ... 

Und der Hörer auf FeelingsFragment:

private AdapterView.OnItemClickListener onGridViewItemClick() { 
    return new AdapterView.OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 
      Feeling selected = feelings.get(position); 
      ((FeedActivity)getActivity()).setSelectedFeeling(selected); 
      getActivity().getSupportFragmentManager().popBackStack(); 
     } 
    }; 
} 

Es ist alles ganz gut funktioniert: User tippt die Gefühle Taste, geht an FeelingsFragment, wählt das Gefühl, ich spare es auf die Aktivität, ruft popBackStack() und auf der onResume Methode das ausgewählte Gefühl in meinem PostFragment anzuzeigen:

@Override 
public void onResume() { 
    super.onResume(); 
    selectedFeeling = ((FeedActivity)getActivity()).getSelectedFeeling(); 
    if(selectedFeeling != null){ 
     selectedFeelingTv.setText(getString(R.string.selected_feeling) + selectedFeeling.getFeeling()); 
    } 
} 

Mein Problem ist, dass der Benutzer auch eine auswählen kann Foto aus der Galerie und wenn er das macht, stellt sich heraus, dass mein ausgewähltes Gefühl null ist. Ich denke, dass das passiert, weil die Aktivität, in der ich es speichere, neu gestartet wird, also wie kann ich diese Daten beibehalten?

+0

Versuchen Sie 'onAttach', nicht' onResume' –

+1

Mögliche Duplikate von [Saving Android Activity-Status mit Save Instance State] (http://stackoverflow.com/questions/151777/saving-android-activity-state-using-save) -instance-state) –

+0

Es hat nicht so gut funktioniert. Mit onAttach wurde das gewählte Gefühl nie angezeigt. – Rob

Antwort

1

Sie können dies, um in Ihrer Tätigkeit, um den Wert zu halten:

@Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putSerializable("selectedFeeling", selectedFeeling); 
    } 

Und den Wert abzurufen, verwenden Sie diese (auch in der Tätigkeit):

@Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     super.onRestoreInstanceState(savedInstanceState); 
     if(savedInstanceState != null){ 
      if(savedInstanceState.getSerializable("selectedFeeling")!=null){ 
      selectedFeeling = (Feeling)savedInstanceState.getSerializable("selectedFeeling"); 
     } 
    } 
} 

Was oben im Code geschieht: die Instanz speichern, wenn die Aktivität zerstört und das Abrufen es dann, wenn die Aktivität ist wiederhergestellt. Es ist wichtig zu betonen, dass Sie den Wert neu setzen müssen, damit Ihr Fragment es mit seiner onResume-Methode lesen kann.

0

Verwenden Sie onSaveInstanceState(Bundle outState) Ihrer Activity, um das Gefühl in outState zu speichern. Und dann lesen Sie das Gefühl von savedInstanceState in onCreate(Bundle savedInstanceState). Mach dasselbe mit all deinen Statusvariablen. Dann machen Sie sich keine Sorgen, wann und aus welchem ​​Grund Android Ihre Aktivitäten zerstört. Es wird mit dem vorherigen Zustand wieder "auferstehen".

0

Die Android-Methode zum Austausch von Daten zwischen Fragmenten und Aktivitäten ist die Verwendung von Broadcasts und Broadcast-Empfängern. Daher würde ich vorschlagen, dass Sie Folgendes tun: In Ihrem Fragment, erstellen Sie Ihre Sendung

public void createBroadcast() 
{ 
    Intent broadcast = new Intent(); 
    broadcast.setAction(RequestCode.SUBMIT_BROADCAST);//This code is a static int just to identify your broadcast 
    broadcast.putExtra("String identifier", your data); 
    context.sendBroadcast(broadcast); 

} 

und feuern, wenn der Benutzer etwas (Ihr Gefühl) wählt

in der Aktivität, registrieren Sie Ihre Rundfunkempfänger und die Aktivität aktualisieren

private BroadcastReceiver br; 
...... 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    br = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      Bundle bundle =intent.getExtras(); 
      String key =bundle.getString("your string identifier"); //the code for updating your activity goes next 

     } 
    }; 

IntentFilter filter = new IntentFilter(RequestCode.SUBMIT_BROADCAST); 
this.registerReceiver(br,filter); 
} 
Verwandte Themen