1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Zugriff auf Felder von Activity1 aus Activity2 heraus

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Grossi, 27.07.2011.

  1. Grossi, 27.07.2011 #1
    Grossi

    Grossi Threadstarter Neuer Benutzer

    Beiträge:
    18
    Erhaltene Danke:
    0
    Registriert seit:
    29.07.2010
    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
     
  2. the_alien, 27.07.2011 #2
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Du musst die Werte entweder speichern in einer SharedPreferences oder Datenbank oder die Menüactivity mit startActivityForResult() starten und das Result zurückgeben.
     
  3. Grossi, 27.07.2011 #3
    Grossi

    Grossi Threadstarter Neuer Benutzer

    Beiträge:
    18
    Erhaltene Danke:
    0
    Registriert seit:
    29.07.2010

    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
     
  4. swordi, 27.07.2011 #4
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    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
     
  5. soma-web, 28.07.2011 #5
    soma-web

    soma-web App-Anbieter (kostenpfl.)

    Beiträge:
    146
    Erhaltene Danke:
    18
    Registriert seit:
    06.07.2011
    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
     
  6. Grossi, 30.07.2011 #6
    Grossi

    Grossi Threadstarter Neuer Benutzer

    Beiträge:
    18
    Erhaltene Danke:
    0
    Registriert seit:
    29.07.2010
    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: 30.07.2011
  7. Grossi, 30.07.2011 #7
    Grossi

    Grossi Threadstarter Neuer Benutzer

    Beiträge:
    18
    Erhaltene Danke:
    0
    Registriert seit:
    29.07.2010
    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
     
  8. Grossi, 31.07.2011 #8
    Grossi

    Grossi Threadstarter Neuer Benutzer

    Beiträge:
    18
    Erhaltene Danke:
    0
    Registriert seit:
    29.07.2010
    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
     

Diese Seite empfehlen