Zugriff auf Felder von Activity1 aus Activity2 heraus

G

Grossi

Gast
Hallo zusammen,

ich habe zwei Activities. Die eine Activity ist mein "Hauptbildschirm" mit allen relevanten Feldern. Die andere Activity ist ein Menü mit mehreren Buttons. Ich möchte jetzt, dass bei Betätigung eines Buttons im Menü mehrere Felder im Hauptbildschirm einen bestimmten Wert zugewiesen bekommen.

Die Frage ist also, wie ich aus Activity2 heraus auf die Felder der Activity1 zugreifen kann.
Wenn ich in Activity2 den Code für einen Button so wie unten aufgeführt ausführe, so stürzt mir die App ab:

((EditText) findViewById(R.id.feldname_aus_activity1)).setText("");
finish();

Wird nur finish(); ausgeführt, so wird das Menü / die Activity erwartungsgemäß geschlossen.

Vielleicht bin ich als Anfänger da ein bischen naiv.
Aber hat jemand von Euch einen Tipp für mich?

Viele Grüsse,
Grossi
 
Du musst die Werte entweder speichern in einer SharedPreferences oder Datenbank oder die Menüactivity mit startActivityForResult() starten und das Result zurückgeben.
 
the_alien schrieb:
Du musst die Werte entweder speichern in einer SharedPreferences oder Datenbank oder die Menüactivity mit startActivityForResult() starten und das Result zurückgeben.


Hallo the_alien,


zwei Fragen dazu:
  1. Wenn ich die Activity mit startActivityForResult() gestartet habe und die zweite Activity beende, wie "bemerkt" Activity1 dann, dass da neue Werte aus Activity2 sind? Sprich in welchem Event muss ich den Result abfragen?
  2. Wenn Activity2 ohne veränderung von Werten beendet wurde - also der Zurück-Button gedrückt wurde, möchte ich die bestehenden Werte in Activity1 ja nicht löschen. Wie kann ich das sicherstellen?
Viele Grüße,
Grossi
 
dann hilft dir die methode

onActivityResult() in activty 1

da kannst du genau all das abchecken. geänderte werte am besten per intent mitgeben dann
 
Hier mal ein paar Codeschnipsel die dir Helfen werden:
Ich hab ein Einstellungsbutton bei den Menüs eingerichtet und ändere meine Hauptactivity über die neue Activity Einstellungen:
Teil des Hauoptschirms:
Code:
@Override
    public boolean onCreateOptionsMenu(Menu menu){
    	getMenuInflater().inflate(R.menu.kreditrechner, menu);
    	return super.onCreateOptionsMenu(menu);
    }

 @Override
    public boolean onOptionsItemSelected(MenuItem item) {
      switch (item.getItemId()) {
        case R.id.einstellungen:        
        	startActivityForResult(new Intent("soma.de.intent."+"action.PREFERENCES"), 101);
          return true;    
  default:
          return super.onOptionsItemSelected(item);        
      }    
    }

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data){
    	switch(resultCode){
    	case Activity.RESULT_OK: 
    		if(data.getExtras().getString("Spinner1").equals("Jahre")){
    			intervall.setImageResource(R.drawable.zeichen_jahre);
    			yearly = true;
    		}else if(data.getExtras().getString("Spinner1").equals("Monate")){
    			intervall.setImageResource(R.drawable.zeichen_monate);
    			yearly = false;
    		}

    		if(data.getExtras().getString("Spinner2").equals("monatlich")){
    			ratenzahlungsart = "montalich";
    			Rueckzahl.setText("im Monat");
    		}else if(data.getExtras().getString("Spinner2").equals("vierteljährlich")){
    			ratenzahlungsart = "vierteljährlich";
    			Rueckzahl.setText("im Vierteljahr");
    		}else if(data.getExtras().getString("Spinner2").equals("halbjährlich")){
    			ratenzahlungsart = "halbjährlich";
    			Rueckzahl.setText("im Halbjahr");
    		}else if(data.getExtras().getString("Spinner2").equals("jährlich")){
    			ratenzahlungsart = "jährlich";
    			Rueckzahl.setText("im Jahr");
    		}
    		break;
    	case Activity.RESULT_CANCELED:
    		break;
    	default:
    		break;
    	}
    }

Und nun die Activity Preferences:


Code:
package soma.de;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Spinner;

public class Preferences extends Activity{
	ImageView v;
	Spinner s;
	Spinner s2;
	Button ok;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		 v = (ImageView)findViewById(R.id.imageView2);
		super.onCreate(savedInstanceState);        
	    setContentView(R.layout.preferences);
		ok = (Button)findViewById(R.id.bt_ok);
		ok.setOnClickListener(Crar);
		
		
		s = (Spinner) findViewById(R.id.spyealy);
	    ArrayAdapter adapter = ArrayAdapter.createFromResource(
	    this, R.array.ArLaufzeit, android.R.layout.simple_spinner_item);
	    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
	    s.setAdapter(adapter);  
	    

		s2 = (Spinner) findViewById(R.id.sprueck);
	    ArrayAdapter adapter2 = ArrayAdapter.createFromResource(
	    this, R.array.ArIntervall, android.R.layout.simple_spinner_item);
	    adapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
	    s2.setAdapter(adapter2);  
	    
	 //   s2.setOnItemSelectedListener(listener);
	}
	/*
	private OnItemSelectedListener listener = new OnItemSelectedListener(){

		@Override
		public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
				long arg3) {
			if(s2.getSelectedItem().toString() == "Jahre"){				
				v.setImageResource(R.drawable.zeichen_jahre);
			}else{
				//v.setImageResource(R.drawable.zeichen_monate);
			}
			
		}

		@Override
		public void onNothingSelected(AdapterView<?> arg0) {
			// TODO Auto-generated method stub
			
		}
		
	};
	*/
	private OnClickListener Crar = new OnClickListener(){
		public void onClick(View v){ 
			final Intent intent = new Intent();
			intent.putExtra("Spinner1", s.getSelectedItem().toString());
			intent.putExtra("Spinner2", s2.getSelectedItem().toString());
			setResult(Activity.RESULT_OK,intent);
			finish();
		}
		
	};
	
}

Ich hoffe ich konnte dir helfen.
Ablauf:
Wenn Activity Prefernces ausgewählt wurde und anschließend auf OK gedrückt wurde wird die Main Activity an die Einstellungen angepasst.

Grüße Soma
 
Hallo zusammen,

in Activity2 gibt es einen Button "neu", der alle Daten in Activity1 löschen soll.
Über onActivityResult() funktioniert das auch wunderbar.
(Ich gebe von Activity2 übrigens nur den Namen des gedrückten Buttons an Activity1 zurück. Da wird dann der Rest erledigt; also das Initialisieren der Felder)

Wenn ich jetzt aber in der Methode onPause() meine Daten speichere, um sie nach dem Beenden der App über onResume() wieder zur Verfügung zu haben, so funktioniert das Initialiseren nicht mehr, da onResume() scheinbar erst nach onActivityResult() ausgeführt wird und somit alle leeren Datenfelder wieder überschrieben werden.

Was kann ich da machen, um das zu verhindern?

Gruß,
Grossi
 
Zuletzt bearbeitet von einem Moderator:
Hallo zusammen,

eine einfache Lösung für mein Problem wäre natürlich, die Activity2 ganz "normal" zu starten - also nicht über startActivityForResult(), den Namen des Buttons im Telefonspeicher abzulegen und nachher in der Activity1 diesen über onResume() wieder abzufragen und entsprechend zu handeln.

Aber eigentlich gefiel mir die Alternative mit startActivityForResult() / onActivityResult() sehr gut und ich möchte ungern davon abgehen.

Also, wenn jemand eine andere Lösung für mein Problem weiss, dann immer her damit.

Viele Grüsse,
Grossi
 
Hallo zusammen,

ich hab' selber eine alternative Lösung gefunden.
In der Methode onActivityResult() setze ich jetzt in Abhängigkeit vom gedrückten Button eine globale Variable, die ich in onResume() dann wieder abfrage. In Abhängigkeit von dieser Variable werden dann die Daten aus dem internen Telefonspeicher (oder einer Datenbank) zurückgeladen oder eben nicht.

Danke für Eure Unterstützung!
Grossi
 

Ähnliche Themen

M
  • MikelKatzengreis
Antworten
5
Aufrufe
131
swa00
swa00
R
  • Robby1950
2
Antworten
23
Aufrufe
1.016
Robby1950
R
Zurück
Oben Unten