2016-04-12 59 views
1

ich die folgende Methode bin mit dem Benutzer speichern eingegebenen Variablen zwischen Aktivitäten:Werte wahren zwischen den Aktivitäten über Bundle

// Save instance between activities 
    @Override 
    public void onSaveInstanceState(Bundle savedInstanceState) 
    { 

     Toast.makeText(searchParam.this, "onSaveInstanceState", Toast.LENGTH_SHORT).show(); 
     savedInstanceState.putString("subject", selectedSubject); 
     savedInstanceState.putString("priceBand", priceBand); 
     savedInstanceState.putFloat("rating", starRating); 
     savedInstanceState.putBoolean("isCheck", checked); 
     super.onSaveInstanceState(savedInstanceState); 
    } 

Wenn der Benutzer die erweiterten Optionen ausgewählt er/sie an den advancedSearch.class geschickt wird, um andere Dinge zu vollbringen über diese Methode:

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


     setContentView(R.layout.activity_main); 

     Toast.makeText(searchParam.this, "onCreate called", Toast.LENGTH_LONG).show(); 
     if (savedInstanceState != null) 
     { 
      Toast.makeText(searchParam.this, "if savedInstanceState != NULL", Toast.LENGTH_LONG).show(); 
      selectedSubject = savedInstanceState.getString("subject"); 
      priceBand = savedInstanceState.getString("priceBand"); 
      checked = savedInstanceState.getBoolean("isCheck"); 
      starRating = savedInstanceState.getFloat("rating"); 
     } 
     else 
      Toast.makeText(searchParam.this, "if savedInstanceState = NULL", Toast.LENGTH_SHORT).show(); 

     // Call all listeners 
     listenerForRatingBar(); 
     listenerForSubject(); 
     listenerForSearch(); 
     listenerForAdvSearch(); 
     listenerForGeoCheck(); 
     listenerForPrice(); 

    } 
:

public void listenerForAdvSearch() 
    { 
     // Initialize advanced options button 
     Button advancedOptionsBtn = (Button) findViewById(R.id.advancedButton); 
     advancedOptionsBtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Intent advancedOptions = new Intent(searchParam.this, advancedSearch.class); 
       startActivity(advancedOptions); 
      } 
     }); 
    } 

Auf Rückkehr ist mein onCreate Methode wie folgt aufgerufen

Ich habe ein paar Toast-Nachrichten für mein persönliches Debugging drin. Mein Problem ist in der if-Anweisung in der onCreate-Methode; Das Paket "savedInstanceState" wird als NULL zurückgegeben und die Werte bei der Rückgabe der erweiterten Optionsklasse werden nicht wiederhergestellt. Warum passiert dies?

HINWEIS: hier ist der entsprechende Code für Advanced Klasse:

public class advancedSearch extends AppCompatActivity { 

    // initialize variables 
    int minute_x, hour_x; 
    int year_x, month_x, day; 
    static final int dialogid = 0; 
    static final int tdialogid = 0; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_advanced_search); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 


     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

     // Call picker dialogs on button click 
     showDialogOnButtonClick(); 
     showTimeDialogOnButtonClick(); 

    } 
+0

Beginnen Sie, einen anderen 'Activity' oder gleich? – razzledazzle

+0

Ich beginne eine neue Aktivität. – Daniel

+0

Überprüfen Sie die bearbeitete Antwort. – razzledazzle

Antwort

1

Sie müssen die Bundle zum Intent hinzuzufügen, dass Sie die Activity von fangen. onSaveInstanceState() wird hier nicht funktionieren. Und innerhalb der anderen Activity, verwenden Sie getIntent().getExtras(), um die Bundle zum Extrahieren der Werte, die Sie hinzugefügt haben, zu erhalten.

onSaveInstanceState() verwendet Activity Zustand während Erholung oder Konfigurationsänderungen des Activity, dass Sie in über Activity-Activity, nicht wiederherstellen.

Das heißt:

Entfernen der Überschreibung zu onSaveInstanceState().

Wenn neue Activity Starten Sie in die Intent müssen in den Daten übergeben:

public void listenerForAdvSearch() 
{ 
    // Initialize advanced options button 
    Button advancedOptionsBtn = (Button) findViewById(R.id.advancedButton); 
    advancedOptionsBtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Intent advancedOptions = new Intent(searchParam.this, advancedSearch.class); 
      advancedOptions.putExtra("subject", selectedSubject); 
      advancedOptions.putExtra("priceBand", priceBand); 
      advancedOptions.putExtra("rating", starRating); 
      advancedOptions.putExtra("isCheck", checked); 
      startActivity(advancedOptions); 
     } 
    }); 
} 

In Ihrem neuen Activity, die Intent die Daten aus dem Bundle nach innen erhalten:

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toast.makeText(searchParam.this, "onCreate called", Toast.LENGTH_LONG).show(); 

    //Get your precious data 
    Bundle bundle = getIntent().getExtras(); 
    selectedSubject = bundle.getString("subject"); 
    priceBand = bundle.getString("priceBand"); 
    checked = bundle.getBoolean("isCheck"); 
    starRating = bundle.getFloat("rating"); 

    // Call all listeners 
    listenerForRatingBar(); 
    listenerForSubject(); 
    listenerForSearch(); 
    listenerForAdvSearch(); 
    listenerForGeoCheck(); 
    listenerForPrice(); 

} 
1

Es sieht wie möchten Sie Daten zwischen zwei Aktivitäten übergeben. Sie können erreichen, dass Daten zu Intent hinzugefügt werden.

In der ersten Aktivität hinzufügen unter Verwendung von Daten putExtra(...):

public void listenerForAdvSearch() 
{ 
    // Initialize advanced options button 
    Button advancedOptionsBtn = (Button) findViewById(R.id.advancedButton); 
    advancedOptionsBtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Intent advancedOptions = new Intent(searchParam.this, advancedSearch.class); 

      advancedOptions.putExtra("subject", selectedSubject); 
      advancedOptions.putExtra("priceBand", priceBand); 
      advancedOptions.putExtra("isCheck", checked); 
      advancedOptions.putExtra("rating", starRating); 

      startActivity(advancedOptions); 
     } 
    }); 
} 

und die Werte in der zweiten Aktivität abrufen:

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

    setContentView(R.layout.activity_main); 

    selectedSubject = getIntent().getStringExtra("subject"); 
    priceBand = getIntent().getStringExtra("priceBand"); 
    checked = getIntent().getBooleanExtra("isCheck"); 
    starRating = getIntent().getFloatExtra("rating"); 
}