Eine Variable von einer anderen Klasse holen..

T

tomycat

Ambitioniertes Mitglied
0
hallo,
ich habe 2 Klassen, in der Hauptklasse wird was berechnet und jetzt wechsle ich in die Klasse setup und ziehe mir die Daten...
Code:
public class MainActivity extends Activity implements OnClickListener {
public String von_der_ersten_Klasse = "test";

Dann öffne ich mit..
Code:
  public void onClick(View v) {
  EditText nameField = (EditText) findViewById(R.id.name_field);
  String name = nameField.getText().toString();

  if (v == zumsetup)
  {
   
     Intent intent = new Intent(this, setup.class);
       this.startActivity(intent);
  }

Es öffnet sich ein Fenster und da soll als erstes test ausgegeben werden.
Code:
public class setup extends Activity implements OnClickListener {

  private Button zurueck;
  private Button speichern;
  @Override
  public void onCreate(Bundle savedInstanceState)  {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.setup);
  
  System.out.println(MainActivity.von_der_ersten_Klasse);  ////// ROTTTTTTTTTTTTTTTTTTTTTTTTTTTT !!!
 
  • Danke
Reaktionen: tomycat
@Jaiel
jein, jein jein, wenn ich die von_der_ersten_Klasse in meiner Hauptklasse verändere und ich öffne mein neue Fenster, dann geht der Inhalt verloren.
Andere Idee,was muss ich ändern, dass ich z.b. 2 Variablen in die andere Klasse mitnehme.
Code:
 Intent intent = new Intent(this, setup.class);
       this.startActivity(intent);
 
Meinst du das?
Hier mal Beispielhaft für eine Kommunikation wie ich sie handhabe:

Activity2 aus Activity1 aufrufen:
Code:
Intent eintragen = new Intent(MainActivity.this, Eintragen.class);
neueActivityerstellt = true;
startActivityForResult(eintragen, 101); // Zahl muss über 0 sein sonst wird onActivityResult nicht ausgeführt

Activity2 schließen und mit daten füllen
Code:
Intent intent = new Intent(Eintragen.this, MainActivity.class);
            intent.putExtra("Activity", 1);
            intent.putExtra("Gegenstand", txtGegenstand.getText().toString());
            intent.putExtra("Anzahl", txtAnzahl.getText().toString());
            this.setResult(RESULT_OK, intent);
            this.finish();

Activty1 verarbeiten von der Rückgabe
Code:
@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) //Wird gestart wenn eine Activity ein Wert zurückgibt
    {
        if (resultCode == Activity.RESULT_OK) {
            //Daten auslesen
            Bundle intent = data.getExtras();
            switch(intent.getInt("Activity"))
            {
                //Neuer Eintrag
                case 1:
                    //Log.d("Neuer Eintrag", intent.getString("Gegenstand") +"|" + intent.getString("Anzahl"));
                    verwalEintraege.neuerEintrag(intent.getString("Gegenstand"), intent.getString("Anzahl"));
                    break;
                //Eintrag Editieren
                case 2:
                    switch(intent.getInt("Aktion"))
                    {
                        //Eintrag ändern
                        case 1:
                            verwalEintraege.ändereEintrag(intent.getInt("Position"),intent.getString("Gegenstand"),intent.getString("Anzahl"),intent.getBoolean("Strike"));
                            break;
                        //Eintrag löschen
                        case 2:
                            verwalEintraege.löscheEintrag(intent.getInt("Position"));
                            break;
                    }
                    break;
            }
        }
        if (resultCode == Activity.RESULT_CANCELED) {
            Log.d("onActivityResult","Result Canceled");
        }
    }

Gruß Thomas
 
  • Danke
Reaktionen: tomycat
tomycat schrieb:
@Jaiel
jein, jein jein, wenn ich die von_der_ersten_Klasse in meiner Hauptklasse verändere und ich öffne mein neue Fenster, dann geht der Inhalt verloren.
Andere Idee,was muss ich ändern, dass ich z.b. 2 Variablen in die andere Klasse mitnehme.

Statische Variablen sind sehr Fragil bei Android. Da passiert das schonmal dass die genullt(0,null,false) werden falls der Class-Loader sich mal dazu entschließt die Klassen neu laden zu lassen.

Mach es so wie @123thomas gesagt hat über Extras die du ins Intent packst. Er macht halt eine Activity auf um von der Daten zubekommen.

Bei dir wird es dann ausreichen das Intent-Objekt mit Extras "vollzustopfen" und dann in der nachfolgenden Activity einfach auszulesen.
 
  • Danke
Reaktionen: tomycat
@123thomas
wie ich das meine ? :)
In meinem Hauptfenster berechne ich z.B.
int a = 10 +2 +3;
Dann will ich den Wert a übertragen in meine neue class (Fenster), das wäre 15. Werte vom neuem Fenster ins Hauptfenster brauche ich nicht.
 
Dann einfach per intent und extra (wie oben beschrieben). Ist die gängigste Methode zwischen Activities Informationen auszutauschen.

Für die Zukunft: Wenn du mit dem Projekt fertig bist, schau dir mal Fragmente an. Die sind wesentlich flexibler, und man kommt nicht so leicht an die Daten der App.
 
Du kannst die Klasse Intent auch überschreiben und ein Objekt als Attribut deklarieren. Dieses Objekt hält dann deine gesamte Information die du brauchst und du brauchst nur das Objekt der Intent Sub-Klasse zu übergeben und daraus das Objekt ansprechen welches deine Infos hält.

Eine andere MEthode wäre sharedPreferences zu nutzen.
 
Code:
 public void onClick(View v)
    {
        if (v == aa)
  {
 
         Intent intent = new Intent(todo.this, todoin.class);
         neueActivityerstellt = true;
       this.startActivity(intent,"101");
  }
todo ist meinn Hauptfenster in dem ich arbeite
todoin ist mein neues Fenster.
Sorry, dass ich mich so anstelle.
 
Was ist das?

Du sprichst da startActivity(Intent,Bundle) an, aber das ergibt für mich keinen Sinn :(

Activities sind keine "Fenster". Das was einem Fenster am nähesten kommt sind Views. Du kannst dann viele Views gleichzeitig auf dem Bildschirm haben aber immer nur eine Activity, deswegen ist "neueActivityerstellt" auf true setzen nicht so sinnvoll wenn das Activity-Objekt kurze Zeit später zerstört wird, dda eine neue Activity gestartet wird von dir.
 
Hallo tomcat,
Klassen fangen in Java mit einen Großbuchstaben an. Also ToDo und ToDoIn.

Code:
 public void onClick(View v)
    {
        if (v.equals(aa))
  {
         Intent intent = new Intent(ToDo.this, ToDoIn.class);
         neueActivityerstellt = true; // ?? macht keinen Sinn
         intent.putExtra("key_1", "101");
         
       this.startActivity(intent);
  }


@Jaiel
Views sind Views. ;) Activities und Fragmente entsprechen schon am nächsten denn, was normalerweise als "Fenster" / Window bezeichnet wird. Schau Dir mal eine Form (WindowsForm) unter C# an. Du wirst viele Ähnlichkeiten finden.
 
kann man per intent und extra, einer Activiti auch einen Wert übergeben, ohne jetzt die Activiti zu starten (für den Benutzer nicht sichtbar) aber so dass der Wert übergeben wird ? Ich habe es auch schon der SharedPreferences probiert was allerdings nicht geklappt hat .. :sad:
 
Erstelle eine neu Klasse und nenne Sie beispl. Global.java.

Dort schreibst du rein public static String test = "";

Kannst natürlich auch boolean und integer so erstellen.

Von jeder Klasse aus, kannst du nun mit Global.name_der_variable drauf zugreifen und abändern.
Die einfachste und beste Methode. Ich Arbeite ausschließlich damit.
 
@kukuk
statische Variablen haben wir schon am Anfang diskutiert :)

"Die einfachste und beste Methode". Die beste ist es mMn nicht, allgemein gesprochen. Es kommt auf die Applikation an und wie du damit umgehst.

Und: Stell dir vor du hast eine Klasse mit vielen statischen Variablen, die sehr wichtig sind. Auf einmal kommt der Class-Loader und beschließt deine Klasse neu zu laden -> Informationen verschwinden ins Nirvana und die App hat einen inkonsistenten Zustand :(

Jaiel
 
  • Danke
Reaktionen: markus.tullius
Da kann ich Jaiel nur beipflichten.
@kukuk, so wie du die statischen Variablen verwendest, ist ein NO GO. :(

Das wichtigste Konzept von Java ist die Kapselung von Programmcode. Du machst das Gegenteil, sprich du unterläufst alle Sicherheitsmechanismen von Java. Und der GC kann den Speicher nicht leer räumen. Im schlimmsten Fall schmiert die App ab, weil der Speicher voll ist.
So was hat man auch Spagetti-Code. :(
 
@Jaiel und @markus.tullius
Finale statische Variablen sind aber unbedenklich oder?
Bisher habe ich diese nämlich genutzt um den Key für Extras(bzw Bundles) zu speichern, die ich dann Intents mitgebe.
 
JA würd ich sagen ist ok. Wenn die Klasse neu geladen wird dann wird diese ja wieder reinitialisiert. Kritisch wird es bei statischen Variablen deren Inhalt dynamisch verändert wird...
 
  • Danke
Reaktionen: Feuerstern
@Feuerstern,
ja, sind unbedenklich. Benutze ich auch gerne. :)

Nur Variablen, die nur static sind, sind ein Problem. Sie verursachen Memory Leaks. :(
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: Feuerstern

Ähnliche Themen

D
  • Data2006
Antworten
14
Aufrufe
496
jogimuc
J
A
Antworten
10
Aufrufe
1.022
swa00
swa00
Zurück
Oben Unten