[ERLEDIGT] Spinner feste double Werte zuordnen

P

prof.dopenudel

Neues Mitglied
2
Hallo Leute,

ich bitte dringends um Eure Hilfe. Finde zu dem Thema leider nichts was mir weiterhilft. Weder zu Java in Eclipse (das man dann eventuell auf Android Studio übertragen könnte) noch etwas zu Android Studio.

Ich muss direkt mal sagen, dass ich ein absoluter Anfänger bin, was das Android programmieren angeht. Mit Java kenne ich mich ein bisschen aus, aber bin da auch kein Experte drin. Anfänger/Amateur triffts wohl besser.
Ich habe mir ein paar YouTube Videos angeschaut, aber diese liefern leider auch nicht alles, was man braucht.

So nun mal mein Problem.
Ich würde gerne eine App programmieren. Weiß jetzt nicht, ob man auch sagen muss um was es sich in der App dreht?
Naja. Ich benutze das Programm "Android Studio 2.3"und habe ein Androidhandy mit der Version 7.0.

Nun mal meine eigentliche Frage.
Ich habe die App soweit, dass die Benutzeroberfläche quasi fertig ist. Nicht nur quasi, sondern sie ist fertig.

Es soll um den Kalorienverbrauch gehen. Ist nur für mich, dass ich mal sehe, wie so eine App eigentlich funktioniert (Wenn das was wird, dann könnte man es ja eventuell auch in den PlayStore hochladen :) )
So. Man gibt also sein Alter, Größe und Gewicht ein. Das mache ich über einen editText. Also 3 mal einen editText, welcher die Werte dann ausliest.
Nun habe ich dort einen Spinner, der nach der Aktivität frägt. Also wie viel Sportstunden pro Woche man auf die Uhr kriegt. Dazu habe ich eine String.xml Datei erstellt und dort ein String-array mit den Auswahlmöglichkeiten eingefügt.
Das klappt auch. Also wenn ich die App ausführe, dann kann ich die verschiedenen Einträge auswählen.
So weit, so gut.
Jetzt möchte ich aber gerne, dass wenn ich z.B. den Eintrag "3-4 Std/Woche" auswähle, ein Doublewert übergeben wird. Dieser fließt dann in die Berechnung mit ein.
In der .java Datei habe ich bereits eine onClick Methode erstellt, welche dann beim betätigen eines Buttons, den Grundumsatz ausgibt. Das funktioniert ohne die Spinner auch so wie es soll, aber ich möchte eben, dass die Werte aus den Spinnern auch dazu gerechnet werden. Nur leider weiß ich nicht, wie und wo ich das beschreiben/eingeben soll.

Ebenfalls habe ich noch 2 RadioButtons, 1mal weiblich und 1mal männlich. Da wäre es nicht schlecht, wenn man weiblich auswählt, dass dann eine andere Formel genutz wird als wenn man männlich auswählt. Da habe ich leider auch keine Ahnung davon. Dort habe ich auch eine RadioGroup in der die beiden Buttons drin sind. Weiß ja nicht, ob man das braucht.

Falls ich noch einen Code hochladen soll, dass es verständlicher ist, dann einfach sagen bitte.

Vielen Dank schonmal im voraus! :)

Liebe Grüße
 
Hallo,


um dir da weiter zu helfen musst du wohl den Code hochladen. ich konnte gerade noch kein Problem erkennen.

Gruß
 
  • Danke
Reaktionen: prof.dopenudel, lordzwieback und swa00
Vielen Dank für die schnellen Antworten! :)
Das dachte ich mir schon fast. Sorry, dass ich ihn nicht direkt mitgeschickt habe.

Code:
package com.example.simonson.karlorienverbrauchcalculator;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.TextView;

import org.w3c.dom.Text;

import static com.example.simonson.karlorienverbrauchcalculator.R.id.textErgebnis;

public class Grundumsatz extends Activity implements View.OnClickListener {
    EditText editGroese, editGewicht, editAlter;
    TextView textErgebnis;
    Button buttonGrundumsatz;

    double erg;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.grundumsatz);
        Button buttonGrundumsatz = (Button) findViewById(R.id.buttonGrundumsatz);
        buttonGrundumsatz.setOnClickListener(this);
        editGroese = (EditText)findViewById(R.id.editGroesse);
        editGewicht = (EditText)findViewById(R.id.editGewicht);
        editAlter = (EditText)findViewById(R.id.editAlter);
        textErgebnis = (TextView)findViewById(R.id.textErgebnis);
        buttonGrundumsatz = (Button)findViewById(R.id.buttonGrundumsatz);

    }

    public void ButtonOnClick(View v) {
            Button buttonGrundumsatz = (Button) v;


    }

    public void GehZurueck(View v) {
        if (v.getId() == R.id.buttonZurueck) {
            Intent j = new Intent(Grundumsatz.this, MainActivity.class);
            startActivity(j);
        }
    }

   /*                                                                   Das habe ich im Internet gefunden. Leider hat das nicht funktioniert. 
public void onRadioButtonClicked(View view) {
        boolean checked = ((RadioButton) view).isChecked();

        switch (view.getId()) {
            case R.id.rbWeiblich:
                if (checked)
                    break;
            case R.id.rbMaennlich:
                if (checked)
                    break;
        }
    }*/

    public void onClick(View v) {
        EditText eteditGewicht = (EditText) findViewById(R.id.editGewicht);
        EditText eteditGroesse = (EditText) findViewById(R.id.editGroesse);
        EditText eteditAlter = (EditText) findViewById(R.id.editAlter);
        TextView ettextErgebnis = (TextView) findViewById(R.id.textErgebnis);
        RadioButton etradiobuttonweiblich = (RadioButton) findViewById(R.id.rbWeiblich);
        RadioButton etradiobuttonmaennlich = (RadioButton) findViewById(R.id.rbMaennlich);

        double ge = Integer.parseInt(eteditGewicht.getText().toString());
        double gr = Integer.parseInt(eteditGroesse.getText().toString());
        double al = Integer.parseInt(eteditAlter.getText().toString());

        erg = ge + gr + al;                                                                //Die Rechnung stimmt natürlich nicht, aber der richtige Algorithmus kommt noch.
        textErgebnis.setText(String.valueOf(erg));


    }
}

Meine xml Dateien benötigt ihr nicht?

Die String Array sieht so aus.

<string-array name="sportarten">
<item>Aktivität wählen</item>
<item>sehr leicht - nur sitzend oder liegend</item>
<item>normal - sitzend, kaum körperliche Aktivität</item>
<item>mäßig - leichtes Training (3-4 Std/Woche)</item>
<item>aktiv - viel Training (4-5 Std/Woche)</item>
<item>stark aktiv - körperliche Arbeit und hartes Training</item>
<item>extrem aktiv - Harte Arbeit, Leistungssport</item>
</string-array>


Danke Euch nochmals für die Hilfe.

Grüße
 
Hallo Prof,

trotz intensiver Suche , habe ich in deinem Code aber keinen von dir oben erwähnten Spinner entdeckt :)

Aber wenn du schon mit double / float arbeiten möchtest , dann müsstest Du diese auch so anwenden

VON :
Code:
 double ge = Integer.parseInt(eteditGewicht.getText().toString());

IN

Code:
 float ge = Float.parseFloat(eteditGewicht.getText().toString());

Sonst darfst du dich nicht wundern , dass du nur Ganzzahlenwerte erhälst :)


Und bei deinen RadioButtons solltest du schon einen eigenen ClickListener zuweisen
Deswegen geht auch der Code ( den du aus dem Netz hast) nicht
Aber ich sehe auch nirgendwo in deinem Code, dass du einen verweis auf einen RadioButton ermittelst
 
  • Danke
Reaktionen: prof.dopenudel und 123thomas
Was swa00 mit den letzten sätzen sagen möchte, dass in deinem Code einige Grundsatzfehler vorhanden sind. Du solltest dir eventuell nochmal Java ein bisschen anschauen.Dazu zwei Beispiele.

Beispiel 1: Objekte und Elemente legst du mehrmals an:
in OnCreate so wie es richtig ist. Dort Legst du den EditText vorher in der Klasse als Variable an und in OnCreate initialisiert du diese dann.
Code:
editGewicht = (EditText)findViewById(R.id.editGewicht);
Aber warum legst du den Edittext erneut in OnCLick Methode an?
Code:
EditText eteditGewicht = (EditText) findViewById(R.id.editGewicht);

Beispiel 2: Keine Benutzung oder Rückgabe
In den Cases fragst du mit der If ab, ob der aktuelle RadioButton checked ist oder nicht, aber benutzt oder gibts den Wert nirgends zurück.
Code:
public void onRadioButtonClicked(View view) {
        boolean checked = ((RadioButton) view).isChecked();

        switch (view.getId()) {
            case R.id.rbWeiblich:
                if (checked)
                    break;
            case R.id.rbMaennlich:
                if (checked)
                    break;
        }

Gruß Thomas
 
  • Danke
Reaktionen: swa00 und prof.dopenudel
Guten Abend,

sorry für das späte Schreiben...hab mein Passwort vergessen und deswegen wurde mein Konto vorübergehend deaktiviert :D

Der Spinner ist noch nicht in dem Code. Der ist nur in der xml. Habe ihn bis jetzt nur in die Oberfläche eingebunden und über die String.xml eben gesagt, was da rein soll.
Ich habe leider keine Ahnung wie ich bei dem Spinner vorgehen muss. Irgendwie muss das ja aber mit if-else Anweisungen gehen?

Also wenn man dann "sehr leicht - nur sitzend oder liegend" auswählt, dass man das dann über
if (dann eben den array Eintrag aus der String nimmt)
Anweisung: Dann wird die Endformel durch diese Anweisung mit dem Faktor 2 multipliziert;
else if (nächste Eintrag)
Anweisung: ;

Und so weiter. Aber wem erkläre ich das überhaupt. Ihr seid die Profis :) Ich hoffe nur, dass man verstehen kann, was ich damit meine.


Mit dem double/float meinst Du, dass der Part "Integer.parseInt" nicht funktionieren kann, wenn man vorne ein double hat?
An das habe ich garnicht gedacht. Vielen Dank schon einmal dafür!


@123thomas

Dir auch danke für die Antwort. Freue mich über jede Hilfe :)

Vielleicht sollte ich mir Java echt noch einmal anschauen. Java ist eine Insel...ist das zu empfehlen?

Das mit dem doppelten initialisieren...darauf habe ich noch nicht geachtet. Da es funktioniert hat, habe ich das so gelassen. Wird aber noch bearbeitet. Danke für den Hinweis.

Und das der RadioButton nichts macht weiß ich. War ja sowieso nur mal in einem Kommentar verfasst.
Wenn ich das dann gescheit machen möchte, muss ich das dann so machen(nachdem ich die Buttons initialisiert habe)

Code:
public void onRadioButtonClicked(View view) {
        boolean checked = ((RadioButton) view).isChecked();

        switch (view.getId()) {
            case R.id.rbWeiblich:
                if (checked)
                  //hier kommt dann der Algorithmus für weiblich hin?
                    break;
            case R.id.rbMaennlich:
                if (checked)
             //und hier männlich
                    break;
        }

oder fehlt da noch etwas?

Falls das so passen würde, dann könnte man ja die Letzte onClick Methode löschen? Da ja in der onRadioButtonClick Methode dann alles drin was man braucht?

Gruß
 
Mit dem double/float meinst Du, dass der Part "Integer.parseInt" nicht funktionieren kann, wenn man vorne ein double hat?
An das habe ich garnicht gedacht. Vielen Dank schon einmal dafür!
Doch das wird schon funktionieren ist nur Unsinn, da Integer.praseInt immer ein int Wert also ein Ganzzahlenwert zurück gibt. Daher ist der double da vorne Ressourcen Verschwendung.

oder fehlt da noch etwas?

Falls das so passen würde, dann könnte man ja die Letzte onClick Methode löschen? Da ja in der onRadioButtonClick Methode dann alles drin was man braucht?
Ne das ist nicht ganz korrekt. Da der Benutzer ja auch erst auswählen kann welches Geschlecht er hat und dann den Rest eingibt. Dann hättest du zum Zeitpunkt der Berechnung die Größe, Gewicht etc. nicht.

Ich weiß zwar nicht genau wie die Activity etc. von dir aussieht aber ich würde es so machen, dass die Berechnung eine eigene Methode wird. Bei jeder Aktion (Änderung der Radio Button oder ein Wert wird geändert) wird dann die Berechnung angestoßen.

Bei der Berechnung wird erst Überprüft ob alle Werte eingegeben und plausibel sind. Und wenn das alles passt dann berechnen und Ausgeben.

Gruß
 
  • Danke
Reaktionen: prof.dopenudel und swa00
Dadurch gibt es dann ja auch Rundungsfehler?
Habe es auf jeden Fall geändert. Danke

Ne das ist nicht ganz korrekt. Da der Benutzer ja auch erst auswählen kann welches Geschlecht er hat und dann den Rest eingibt

Das Problem ist, dass von vorne an bereits "weiblich" ausgewählt ist. Wenn ich dann auf männlich drucke, dann bleibt der Bobbel bei weiblich trotzdem drin. Die Rechnung wird aber ausgeführt...habe den Code jetzt umgeschrieben. Jetzt ist es so wie ich wollte, nur bleibt der RadioButton nonstop auf weiblich oder männlich oder beidem. Wie gesagt. Als erstes ist weiblich ausgewählt. Der Bobbel bleibt dann ständig rot. Wenn ich dann männlich auswähle bleibt weiblich rot und männlich wird auch rot. Somit sind also beide ausgewählt. Die Rechnung wird aber auf jeden Fall richtig ausgeführt.


Und noch mal die Frage zwegs den Spinnern. Wie funktioniert das? Könnt Ihr mir da helfen?
 
Hallo Nudel :)

Diese zwei Links dürften Dir schon bei dem Spinner helfen

Spinners | Android Developers
Android spinner (drop down list) example


An dieser Stelle möchte ich Dir ans Herz legen , dich nochmals ein wenig mit den Grundlagen
auseinander zu setzen .
Insbesondere mit OOP, Java und vor allem mit den Besonderheiten unter Android

Dazu haben wir eigens einen Titel erstellt :[LEITFADEN] Der Einstieg in die Android Programmierung mit Android Studio


Wir helfen hier sehr sehr gerne Jedem , wenn man sich in einer Sackgasse befindet.
Allerdings können wir hier eher keine Grundlagen erklären .

Bitte habe Verständnis dafür
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: prof.dopenudel
Hallo swa :)

Danke für die Links.

Ihr seid auf jeden Fall auch so eine riesen Hilfe! Respekt an Euch.

Dann werde ich mich mal ein bisschen einlesen. Falls ich dann nicht zu dem Ergebnis komme, kann ich mich ja noch einmal melden :tongue:

Nochmals vielen Dank an Euch zwei @swa00 @123thomas

Grüße
 
Falls ich dann nicht zu dem Ergebnis komme, kann ich mich ja noch einmal melden

Aber sicher : Wie erwähnt, wer mit der Nase an der Wand klebt , bekommt IMMER Hilfe :)
 
  • Danke
Reaktionen: prof.dopenudel
Hallo wieder mal,

sorry, dass ich mich schon wieder melde. Komme aber einfach nicht weiter :(

Habe jetzt eine Möglichkeit, dass die double Werte über den Spinner Eintrag übergeben werden.
Hier mal der Code

Code:
    String[] aktivitaet = {"Faktor 1", "Faktor 2"};
    double[] val1 = {1.0, 2.0};

    MyClass[] obj2 = {
            new MyClass("Faktor 1", 1.0),
            new MyClass("Faktor 2", 2.0),
    };

    private Spinner spinner1;
    private TextView textErgebnis, textPal;
    private EditText editGewicht, editGroesse, editAlter;
    private double ergGeschlecht, erg, erg1;

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

        textPal = (TextView) findViewById(R.id.textPal);
        spinner1 = (Spinner) findViewById(R.id.spinner1);
        ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_item, aktivitaet);
        adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner1.setAdapter(adapter1);
        spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                    String s1 = String.valueOf(val1[position]);
                    textPal.setText(s1);
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });
    }

die MyClass Klasse fehlt, aber das sollte glaube ich nichts ausmachen bei meinen Problemen.

Nun zu den Problemen.
1. wird der entsprechende Wert in eine TextView Datei übergeben. Geht das auch, dass ich das einfach in eine editText Datei übergeben kann? Oder kann ich den Wert aus der TextView auch für eine Rechnung benutzen? Alles was ich versucht habe, ging nach hinten los.
Wollte den Wert der TextView einfach direkt in eine EditText weitergeben.

2. Ist es irgendwie möglich, dass wenn ich z.B. ein Gewicht von >60kg eingebe, das Programm mir diese "double[] val1 = {1.0, 2.0};" Werte übergibt und wenn ich <60kg eingebe er mir z.B. "double[] val2 = {14.0, 12.0};" diese Werte übergibt? (das sind natürlich irgendwelche fiktiven Werte)
Wollte es über eine if Anweisung machen, aber wie? Wo muss die Anweisung hin? Muss ich dann jedes mal ein String Array(Das wahrscheinlich nicht, da es ja jedes mal die gleiche Liste ist?), so ein double[]val und ein MyClass[]obj3 erstellen?
Wollte die if Anweisung in die onCreate Methode einbinden, aber dann schmiert mir immer die App ab, sobald ich sie öffnen möchte.

Tut mir leid für das erneute Nerven, aber ich suche da schon seit Stunden nach etwas gescheitem...

Danke mal :)

Grüße
 
Ich habe deine Fragen nicht ganz verstanden aber ich versuchs mal:
1. Gebe den Text aus der Textview und schreibe diesen in den Edittext
Code:
editText.setText(textView.getText());
2.
Code:
double[] val1 = {1.0, 2.0};
double[] val2 = {14.0, 12.0};
doube[] aktuellerFaktor = new double[2];
if(gewicht > 60)
{
 aktuellerFaktor = val1;
}
if(gewicht < 60)
{
 aktuellerFaktor = val2;
}
Aber ich habe dir nochmal schnell ein Beispiel geschrieben.(Schnell runter daher auf nicht auf Kleinigkeiten geachtet
Ich habe mal angenommen du brauchst den Faktor für eine BMI Berechnung.
Dann habe die Klasse für die Faktoren erstellt.

BmiFaktor.java
Code:
package example.spinnerexample;

/**
 * Created by Thomas on 27.04.2017.
 */

public class BmiFaktor {

    private String faktorname;
    private double faktor;

    public BmiFaktor(String faktorname, double faktor)
    {
        this.faktorname = faktorname;
        this.faktor = faktor;
    }

    public void setFaktorname(String faktorname) {
        this.faktorname = faktorname;
    }
    public String getFaktorname() {
        return faktorname;
    }

    public void setFaktor(double faktor) {
        this.faktor = faktor;
    }
    public double getFaktor() {
        return faktor;
    }

    //override ToString() damit nicht das Objekt angezeigt wird sonder der Faktorname

    @Override
    public String toString() {
        return this.faktorname;
    }
}

und die Main Aktivity
Code:
package example.spinnerexample;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.TextView;

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

public class MainActivity extends AppCompatActivity {

    private Spinner spinner;
    private TextView test;
    private double faktorausgewählt;
    private Button berechne;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        test = (TextView)findViewById(R.id.textView);
        spinner = (Spinner)findViewById(R.id.spinner);
        berechne = (Button)findViewById(R.id.button);

        BmiFaktor bmiFaktor_männlich = new BmiFaktor("männlich",2.0);
        BmiFaktor bmiFaktor_weiblich = new BmiFaktor("weiblich",1.0);
        final List<BmiFaktor> listeBmiFaktoren = new ArrayList<>();
        listeBmiFaktoren.add(bmiFaktor_männlich);
        listeBmiFaktoren.add(bmiFaktor_weiblich);
        ArrayAdapter<BmiFaktor> spinneradapter = new ArrayAdapter<BmiFaktor>(MainActivity.this,android.R.layout.simple_spinner_item,listeBmiFaktoren);

        spinner.setAdapter(spinneradapter);
        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                faktorausgewählt = listeBmiFaktoren.get(i).getFaktor();
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {

            }
        });

        berechne.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                test.setText(String.valueOf((5+5)*faktorausgewählt));
            }
        });

    }
}

Das Beispielprojekt kannst du hier laden:
Dropbox - spinnerexample.zip

Falls du dann noch fragen hast dann bitte nochmal genau erklären.
 
  • Danke
Reaktionen: prof.dopenudel und swa00
@123thomas

An dieser Stelle einmal einen herzlichen Dank an Dich, für Deine wirklich ungewöhnliche ausführliche Hilfestellung !!

Hut ab !
 
  • Danke
Reaktionen: prof.dopenudel und 123thomas
@123thomas

Wow. Respekt. Ich weiß das wirklich zu schätzen! Da es ja nicht die Tagesordnung ist, in diesem Umfang zu helfen. Wirklich einen riesen Respekt an dich und natürlich tausend Dank!!! :)

Kann mich leider erst wieder am Montagabend an die App ranmachen. Werde dann berichten.
Noch einmal vielen, lieben Dank!

Dir natürlich auch swa00.
Diese Bereitschaft ist einfach mega!

Ein schönes, verlängertes Wochenende euch allen! :)

Grüße
 
  • Danke
Reaktionen: swa00

Ähnliche Themen

5
Antworten
22
Aufrufe
1.341
590239
5
H
  • HoustonWeHaveAProblem
Antworten
3
Aufrufe
782
moin
M
P
  • pagrf
Antworten
9
Aufrufe
968
SlayNox
S
Zurück
Oben Unten