Wechsel zwischen Acivitys

  • Antworten:62
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

24.12.2014, 15:53:05 via App

Wie sieht denn ein Stack aus?
Du kannst diesen auch statisch/in singleton speichern dann musst du das nicht per intent übergeben.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
OverBurned
  • Forum-Beiträge: 49

24.12.2014, 16:55:05 via Website

Das Speichern ist glaub echt gut :) wie geht das?

Ein Stack ist ein Stapel bei dem ich immer nur auf das oberste Objekt zugreifen kann. Den brauch ich für den Stackrechner. Man gibt da erst alle zahlen und dann die Rechenzeichen ein(UPN).

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

24.12.2014, 16:57:45 via App

Ach so stimmt gerade noch mal nachgeschaut.

Du kannst eine Klasse machen inder dein Stack static ist. Dann kannst dubüberall drauf zugreifen.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
OverBurned
  • Forum-Beiträge: 49

24.12.2014, 17:19:05 via Website

Aber ich stelle ja in meiner mainActivity eine hat Beziehung her und dann ist der Stack ja nur für diese spezielle Main Klasse verfügbar

Das Thema geht mir langsam echt auf die nerven :(

Ich füg mal die drei Quelltexte von meiner Rechner.java, OperatorActivity.java und MainActivity.java hier ein. Vieleicht hab ich einfach grundsetzlich nen Fehler drin.

    Rechner.java

package com.example.stackrechner;
//Importieren der Stack-Klasse
import java.util.Stack;

public class Rechner{
        // Zunächst definieren wir den operationsStack vor, ohne ihn einen Wert zu zuweisen.
        public Stack <Double> valueStack;
        public boolean Check;
        public String strHistory;

        //Konstruktor für Rechner-Klasse
        Rechner( )
        {
                //operationsStack wird das neue Objekt vom Stack-Konstruktor zugewiesen
                //man beachte, dass hier erneut der Typ des
                valueStack = new Stack<Double>();
        }

        public void add (String pZahlStr){
            Double zahl = Double.valueOf(pZahlStr);
            valueStack.push(zahl);            
        }

        public String getTop (){
            String str = valueStack.peek().toString();
            return str;
        }

        public boolean StackCheck (){
            Check = valueStack.isEmpty();
            return Check;
        }

        public boolean DoubleStackCheck(){
            if (this.StackCheck() == false){
                Double stValue1 = valueStack.peek();
                valueStack.pop();
                Check = this.StackCheck();
                valueStack.push(stValue1);
                return Check;
            }
            return true;
        }

        public String addieren (){
                    Double wert1 = (Double) valueStack.peek();
                    strHistory = wert1.toString() + " + ";
                    valueStack.pop();
                    Double wert2 = (Double) valueStack.peek();
                    strHistory = strHistory + wert2.toString() + " = ";
                    valueStack.pop();
                    Double ergebnis = wert2 + wert1;
                    strHistory = strHistory + ergebnis.toString();
                    valueStack.push(ergebnis);
                    return strHistory;
        }

        public String subtrahieren (){
                    Double wert1 = (Double) valueStack.peek();
                    strHistory = wert1.toString() + " - ";
                    valueStack.pop();
                    Double wert2 = (Double) valueStack.peek();
                    strHistory = strHistory + wert2.toString() + " = ";
                    valueStack.pop();
                    Double ergebnis = wert2 - wert1;
                    strHistory = strHistory + ergebnis.toString();
                    valueStack.push(ergebnis);
                    return strHistory;
        }

        public String multiplizieren (){
                    Double wert1 = (Double) valueStack.peek();
                    strHistory = wert1.toString() + " * ";
                    valueStack.pop();
                    Double wert2 = (Double) valueStack.peek();
                    strHistory = strHistory + wert2.toString() + " = ";
                    valueStack.pop();
                    Double ergebnis = wert2 * wert1;
                    strHistory = strHistory + ergebnis.toString();
                    valueStack.push(ergebnis);
                    return strHistory;
        }

        public String dividieren (){    
                    Double wert1 = (Double) valueStack.peek();
                    strHistory = wert1.toString() + " / ";
                    valueStack.pop();
                    Double wert2 = (Double) valueStack.peek();
                    strHistory = strHistory + wert2.toString() + " = ";
                    valueStack.pop();
                    Double ergebnis = wert2 / wert1;
                    strHistory = strHistory + ergebnis.toString();
                    valueStack.push(ergebnis);
                    return strHistory;
        }

         public String Wurzel (){
                    Double wert1 = (Double)  valueStack.peek();
                    strHistory = wert1.toString() + " = ";
                    valueStack.pop();      
                    Double ergebnis = Math.sqrt(wert1);
                    strHistory = strHistory + ergebnis.toString();
                    valueStack.push(ergebnis);
                    return strHistory;
        }
        }

OperatorActivity.java

package com.example.stackrechner;

import java.util.ArrayList;
import java.util.List;

import android.support.v7.app.ActionBarActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class OperatorActivity extends ActionBarActivity {

List<String> liHistory = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_operator);

    importButton();

    Intent getListView = getIntent();
    liHistory = getListView.getStringArrayListExtra("Verlauf");
}

@Override
public boolean onCreateOptionsMenu(Menu menu){
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.operator, menu);

    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item){
    if (item.toString().equals("Verlauf")){
        Intent History = new Intent(this, HistoryActivity.class);
        History.putStringArrayListExtra("Verlauf", (ArrayList<String>;) liHistory);
        startActivity(History);
    }
    else if (item.toString().equals("Impressum")){
        Intent Impressum = new Intent(this, ImpressumActivity.class);
        Impressum.putStringArrayListExtra("Verlauf", (ArrayList<String>;) liHistory);
        startActivity(Impressum);
    }
    else if (item.toString().equals("Operatoren")){

    }
    else if (item.toString().equals("Rechner")){
        setContentView(R.layout.activity_main);
    }
    return true;
}

public void importButton (){
    Button  btWurzel=(Button)findViewById(R.id.btWurzel);
    btWurzel.setOnClickListener(ClickListener);
}

public OnClickListener ClickListener =  new OnClickListener() {    
public void onClick(View v)
{
    if (v.getId() == R.id.btWurzel){
        Intent i = new Intent(OperatorActivity.this, MainActivity.class);
        i.putExtra("methodName","Wurzel");//goes to previous INtent
        i.putStringArrayListExtra("Verlauf", (ArrayList<String>;) liHistory);
        startActivity(i);//will trigger only myMethod in MainActivity
    }
}
};

}

MainActivity.java

package com.example.stackrechner;

import java.util.ArrayList;
import java.util.List;

import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends ActionBarActivity {

// Das Rechner-Objekt
private Rechner hrechner;
public List<String> liHistory;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // Es wird ein neues Rechner-Objekt erstellt der Klasse Rechner.java erstellt
    hrechner = new Rechner();
    liHistory = new ArrayList<String>();
    importButton();
    onNewIntent(getIntent());
}

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);

    if (intent.getStringExtra("methodName") != null) { 
        if (intent.getStringExtra("methodName").equals("Wurzel")) {
            myMethod();
            if (hrechner.StackCheck() == false){                //hier liegt das Problem! Der Stack ist leider leer wenn die MainActivity neu geöffnet wird.
                myMethod();
                String valueHistory = hrechner.Wurzel();
                liHistory.add(valueHistory);;
                EditText tfEingabe = (EditText) findViewById(R.id.tfEingabe);
                tfEingabe.setText(hrechner.getTop());
            }
        }
    }
}

public void myMethod() {
    Log.e("Test", "myMethode");
}


@Override
public boolean onCreateOptionsMenu(Menu menu){
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main, menu);

    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item){
    if (item.toString().equals("Schließen")){
        onCreateDialog(10);
    }
    else if (item.toString().equals("Verlauf")){
        Intent History = new Intent(this, HistoryActivity.class);
        History.putStringArrayListExtra("Verlauf", (ArrayList<String>;) liHistory);
        startActivity(History);
    }
    else if (item.toString().equals("Impressum")){
        Intent Impressum = new Intent(this, ImpressumActivity.class);
        Impressum.putStringArrayListExtra("Verlauf", (ArrayList<String>;) liHistory);
        startActivity(Impressum);
    }
    else if (item.toString().equals("Operatoren")){
        Intent Operator = new Intent(this, OperatorActivity.class);
        Operator.putStringArrayListExtra("Verlauf", (ArrayList<String>;) liHistory);
        startActivity(Operator);
    }
    else if (item.toString().equals("Rechner")){
        setContentView(R.layout.activity_main);
    }
    return true;
}

@Override
protected Dialog onCreateDialog(int id){        
    switch (id) { 
        case 10: Builder builder = new AlertDialog.Builder(this); 
            builder.setMessage("Applikation wird geschlossen!"); 
            builder.setCancelable(true); 

            builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
                public void onClick(DialogInterface dialog, int which) { 
                    MainActivity.this.finish();
                    } 
                });
            builder.setNegativeButton("Nein, doch nicht!", new DialogInterface.OnClickListener() { 
                public void onClick(DialogInterface dialog, int which) { 
                    Toast.makeText(getApplicationContext(), "Applikation wird fortgesetzt", Toast.LENGTH_LONG).show(); 
                    } 
                }); 
            AlertDialog dialog = builder.create();
            dialog.show(); 
    }
            return null;

}

@Override
public void onBackPressed() {
    moveTaskToBack(true);
}   


public String getstrText (){
    EditText tfEingabe = (EditText) findViewById(R.id.tfEingabe);
    String stringEingabe = tfEingabe.getText().toString();
    tfEingabe.setText("");
    return stringEingabe;
}

public void addValue(String pValue, int Number){
    EditText tfEingabe = (EditText) findViewById(R.id.tfEingabe);
    tfEingabe.setText(pValue+Number);
}

public void importButton (){
    Button  btEnter=(Button)findViewById(R.id.btEnter);
    btEnter.setOnClickListener(ClickListener);

    Button  bt0=(Button)findViewById(R.id.bt0);
    bt0.setOnClickListener(ClickListener);

    Button  bt1=(Button)findViewById(R.id.bt1);
    bt1.setOnClickListener(ClickListener);

    Button  bt2=(Button)findViewById(R.id.bt2);
    bt2.setOnClickListener(ClickListener);

    Button  bt3=(Button)findViewById(R.id.bt3);
    bt3.setOnClickListener(ClickListener);

    Button  bt4=(Button)findViewById(R.id.bt4);
    bt4.setOnClickListener(ClickListener);

    Button  bt5=(Button)findViewById(R.id.bt5);
    bt5.setOnClickListener(ClickListener);

    Button  bt6=(Button)findViewById(R.id.bt6);
    bt6.setOnClickListener(ClickListener);

    Button  bt7=(Button)findViewById(R.id.bt7);
    bt7.setOnClickListener(ClickListener);

    Button  bt8=(Button)findViewById(R.id.bt8);
    bt8.setOnClickListener(ClickListener);

    Button  bt9=(Button)findViewById(R.id.bt9);
    bt9.setOnClickListener(ClickListener);

    Button  btPlus=(Button)findViewById(R.id.btPlus);
    btPlus.setOnClickListener(ClickListener);

    Button  btMinus=(Button)findViewById(R.id.btMinus);
    btMinus.setOnClickListener(ClickListener);

    Button  btMal=(Button)findViewById(R.id.btMal);
    btMal.setOnClickListener(ClickListener);

    Button  btGeteilt=(Button)findViewById(R.id.btGeteilt);
    btGeteilt.setOnClickListener(ClickListener);

    Button  btBack=(Button)findViewById(R.id.btBack);
    btBack.setOnClickListener(ClickListener);

    Button  btAllBack=(Button)findViewById(R.id.btAllBack);
    btAllBack.setOnClickListener(ClickListener);

    Button  btPunkt=(Button)findViewById(R.id.btPunkt);
    btPunkt.setOnClickListener(ClickListener);

    Button  btNegativ=(Button)findViewById(R.id.btNegativ);
    btNegativ.setOnClickListener(ClickListener);


}


public OnClickListener ClickListener =  new OnClickListener() {    
public void onClick(View v)
{
    if (v.getId() == R.id.btEnter){
        String strValue = getstrText();
        if (strValue.length() != 0 || strValue != "."){
            hrechner.add(strValue);
        }
    }
    else if (v.getId() == R.id.bt0){
        String strValue = getstrText();
        addValue(strValue, 0);
    }
    else if (v.getId() == R.id.bt1){
        String strValue = getstrText();
        addValue(strValue, 1);
    }
    else if (v.getId() == R.id.bt2){
        String strValue = getstrText();
        addValue(strValue, 2);
    }
    else if (v.getId() == R.id.bt3){
        String strValue = getstrText();
        addValue(strValue, 3);
    }
    else if (v.getId() == R.id.bt4){
        String strValue = getstrText();
        addValue(strValue, 4);
    }
    else if (v.getId() == R.id.bt5){
        String strValue = getstrText();
        addValue(strValue, 5);
    }
    else if (v.getId() == R.id.bt6){
        String strValue = getstrText();
        addValue(strValue, 6);
    }
    else if (v.getId() == R.id.bt7){
        String strValue = getstrText();
        addValue(strValue, 7);
    }
    else if (v.getId() == R.id.bt8){
        String strValue = getstrText();
        addValue(strValue, 8);
    }
    else if (v.getId() == R.id.bt9){
        String strValue = getstrText();
        addValue(strValue, 9);
    }
    else if (v.getId() == R.id.btPlus){
        if (hrechner.DoubleStackCheck() == false){
            String valueHistory = hrechner.addieren();
            liHistory.add(valueHistory);
            EditText tfEingabe = (EditText) findViewById(R.id.tfEingabe);
            tfEingabe.setText(hrechner.getTop());
        }
    }
    else if (v.getId() == R.id.btMinus){
        if (hrechner.DoubleStackCheck() == false){  
            String valueHistory = hrechner.subtrahieren();
            liHistory.add(valueHistory);
            EditText tfEingabe = (EditText) findViewById(R.id.tfEingabe);
            tfEingabe.setText(hrechner.getTop());
        }
    }
    else if (v.getId() == R.id.btMal){
        if (hrechner.DoubleStackCheck() == false){  
            String valueHistory = hrechner.multiplizieren();
            liHistory.add(valueHistory);
            EditText tfEingabe = (EditText) findViewById(R.id.tfEingabe);
            tfEingabe.setText(hrechner.getTop());
        }
    }
    else if (v.getId() == R.id.btGeteilt){
        if (hrechner.DoubleStackCheck() == false){
            String valueHistory = hrechner.dividieren();
            liHistory.add(valueHistory);;
            EditText tfEingabe = (EditText) findViewById(R.id.tfEingabe);
            tfEingabe.setText(hrechner.getTop());
        }
    }
    else if (v.getId() == R.id.btWurzel){
        if (hrechner.StackCheck() == false){

            String valueHistory = hrechner.Wurzel();
            liHistory.add(valueHistory);;
            EditText tfEingabe = (EditText) findViewById(R.id.tfEingabe);
            tfEingabe.setText(hrechner.getTop());
        }
    }
    else if (v.getId() == R.id.btBack){
        String strValue = getstrText();
        if (strValue.length() >= 1){
            strValue = strValue.substring( 0, strValue.length()-1 );
            EditText tfEingabe = (EditText) findViewById(R.id.tfEingabe);
            tfEingabe.setText(strValue);
        }
    }
    else if (v.getId() == R.id.btAllBack){
        String strValue = getstrText();
        int inStrValue = strValue.length();
        strValue = strValue.substring(0, strValue.length()-inStrValue);
        EditText tfEingabe = (EditText) findViewById(R.id.tfEingabe);
        tfEingabe.setText(strValue);    
    }
    else if (v.getId() == R.id.btPunkt){
        String strValue = getstrText();
        EditText tfEingabe = (EditText) findViewById(R.id.tfEingabe);
        tfEingabe.setText(strValue+".");
    }
    else if (v.getId() == R.id.btNegativ){
        String strValue = getstrText();
        if (strValue.length() >= 1){
            Double zahl = Double.valueOf(strValue);
            Double negativ = -1.0;
            if (zahl > 0){
                strValue = "-" + strValue;
            }
            else if (zahl < 0){
                zahl = zahl * negativ;
                strValue = zahl.toString();
            }
            else if ( zahl == 0){

            }
            EditText tfEingabe = (EditText) findViewById(R.id.tfEingabe);
            tfEingabe.setText(strValue);
            }
        }
}
};  

}

— geändert am 24.12.2014, 17:23:09

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

25.12.2014, 09:30:24 via App

Da dein Stack im Rechner ist kannst du den einfach als static definieren.
Oder du speicherst ein Rechner Objekt so.

Theoretisch kannst du auch schauen dass su ein Rechnerobjekt über das Intent übergibst. Aber das ist dann schon etwas kompliziert.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
OverBurned
  • Forum-Beiträge: 49

25.12.2014, 14:17:39 via Website

Also wenn ich da nur den stack static setzen muss, dann geht das nicht :(

Aber ich müsste doch prinzipiell den Stack returnen können, in eine Liste konvertieren und dann wie die VerlaufsListe beim Intent immer mitgeben. Wenn dann der Button gedrückt wird, wird die StackListe mitgegeben, zurück zum Stack konvertiert und dann an die Rechner.java wieder zurückgegeben. Dann müsste ich doch den Stack und die History behalten oder?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

25.12.2014, 14:31:24 via App

Warum geht das nicht?
Du wenn du die Liste returnen willst musst du doch auch die Liste static setzen.

Du definierst eine Liste als public static und dann ists kein Probkem.
Falls das ein Stack nixht kann kannst du auhc eine HashMap oder eine List nehmen.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
OverBurned
  • Forum-Beiträge: 49

25.12.2014, 14:57:17 via Website

Ich hab den Stack auf public static gesetzt, aber der Stack ich leider wieder leer wenn ich auf den Button in Activity 2 klicke.
Ich wollte den Stack returnen usw um den Stack beim Start von Activity 2 mit zu übergeben, damit wenn ich dann Activity 1 neu starte, diese den aktuellen Stack wieder hat.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

25.12.2014, 15:50:06 via App

Dann kannst du dir mal die Shared Preferences anschauen. Da kannst du das speichern. Zum Problem weiss ich gerade nicht weiter...

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
pepperonas
  • Forum-Beiträge: 434

25.12.2014, 19:41:48 via Website

Ich nutze auch hin und wieder mal Singletons um in einer App über mehrere Klassen/Activities Daten "erreichbar" zu machen... Deswegen kann ich mich Pascals Vorschlag nur anschließen.. Allerdings ist diese Vorgehensweise nicht ganz unumstritten, da es u.U. zu Memory-Leaks kommen kann (jedenfalls liest man das hin und wieder auf Stackoverflow - habe ich selbst noch nicht beobachten können).

Andere Idee wäre noch den Rechner über Fragmente darzustellen und in Main die "Hauptlogik" zu implementieren, dann gibt es das Problem mit dem Activity-Wechsel nicht.

Btw: diese gefühlten 100 "else if" Prüfungen sind deutlich performancelastiger, als einmal v.getId() auszulesen und dann mittels switch-case die Logik auszuführen (und liest sich auch leichter)...

Und warum den "Stack" nimm für die Zahlen bzw. Rechnenoperationen ebenfalls eine Liste...

Performance

— geändert am 25.12.2014, 19:49:04

Open Source

Antworten
OverBurned
  • Forum-Beiträge: 49

25.12.2014, 20:48:11 via App

Danke für die Tipps! Ich schau mir das morgen mal an.
Der Stackrechner ist meine Facharbeit und ich wollte das der ne Anbindung zum Unterricht hat. Das mit den Performance mach zum Schluss besser. Erstmal soll die App nur vernünftig funktionieren.

LG

Antworten
OverBurned
  • Forum-Beiträge: 49

27.12.2014, 23:20:49 via Website

Pascal P.

Dann kannst du dir mal die Shared Preferences anschauen. Da kannst du das speichern. Zum Problem weiss ich gerade nicht weiter...

Ich hab mir das mal angeschaut. Ich kann da ja nur primitive Datentypen speichern und keine komplexen wie einen Stack. Dfür müsste ich den Stack ja dann zerlgen.

Antworten
OverBurned
  • Forum-Beiträge: 49

30.12.2014, 14:19:26 via Website

Jetzt noch eine letzte Frage :):

Ich habe jetzt in der Klasse, wo der Stack gespeichert ist, folgende Methoden geschreiben:

 public ArrayList getStackAsList (){
    while (!valueStack.isEmpty()){
        strList.add(valueStack.peek().toString());
        valueStack.pop();
    }
    return strList;
}

public void setStackAsList (ArrayList pList){
    for (int i = 0; !pList.isEmpty();i ++){
        Double value = (Double) pList.get(i);
        valueStack.add(value);
    }
}

In der MainActivity sieht das so aus:

 Intent Operator = new Intent(this, OperatorActivity.class);
        Operator.putStringArrayListExtra("Verlauf", (ArrayList<String>;) liHistory);
        Operator.putStringArrayListExtra("Stack", (ArrayList<String>;) hrechner.getStackAsList());
        startActivity(Operator);

Irgendwo hier muss ein Fehler sein. Der Fehler hängt bestimmt mit der ArrayList zusammen, weil ich mir auch nicht sicher bin ob die so funktioniert. Hat jemand eine Idee, was ich falsch gemacht habe?

LG

Antworten