Mit Wert aus SeekBars rechnen?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Mit Wert aus SeekBars rechnen?

    Hi,

    ich habe mich nun ein paar Tage nicht mehr mit dem coden beschäftigt, dementsprechend ist wieder einiges flöten gegangen. Dass geht recht schnell bei mir. Naja, wie dem auch sei.....

    Ich spiele gerade an einem kleinen "Umrechner" um wieder etwas reinzukommen. In diesem Umrechner stelle ich mir die Werte in einer SeekBar ein. Soweit so gut.

    Ich habe 2 SeekBars, und möchte dass nach dem einstellen der Werte mit "diesen" Werten gerechnet wird und dann auf 3 TextViews aufgeteilt wird und dort angezeigt wird.

    Mein Problem liegt bei dem holen der Werte aus den SeekBars um diese zum rechnen zu nutzen und das Ergebsnis dann weiterzugeben an die TextViews. :/
    Soweit habe ich dass bisher umgesetzt bzw. versucht....

    Quellcode

    1. public class MainActivity extends AppCompatActivity {
    2. static int max_ml = 100;
    3. static int min_ml = 1;
    4. static int max_prozent = 100;
    5. static int min_prozent = 1;
    6. TextView textViewOne, textViewTwo, textViewThree, textViewFour, textViewFive;
    7. SeekBar seekBarOne, seekBarTwo;
    8. public void generateResult(int Result){
    9. String milliliter = seekBarOne.toString();
    10. String prozent = seekBarTwo.toString();
    11. int zahl1 = Integer.parseInt(milliliter);
    12. int zahl2 = Integer.parseInt(prozent);
    13. int ergebnis = zahl1 / 100 * zahl2;
    14. int basis = zahl1 - ergebnis;
    15. textViewThree = findViewById(R.id.viewResultBasis);
    16. textViewThree.setText(basis);
    17. textViewFour = findViewById(R.id.viewResultProzent);
    18. textViewFour.setText(ergebnis);
    19. textViewFive = findViewById(R.id.viewResultGesamt);
    20. textViewFive.setText(ergebnis + basis);
    21. }
    22. @Override
    23. protected void onCreate(Bundle savedInstanceState) {
    24. super.onCreate(savedInstanceState);
    25. setContentView(R.layout.activity_main);
    26. // SEEKBAR ONE - MILLILITER
    27. seekBarOne = findViewById(R.id.seekBarMenge);
    28. seekBarOne.setMax(max_ml);
    29. seekBarOne.setProgress(min_ml);
    30. seekBarOne.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
    31. @Override
    32. public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
    33. textViewOne = findViewById(R.id.viewMengeEingabe);
    34. textViewOne.setText(Integer.toString(progress));
    35. generateResult(progress);
    36. }
    37. @Override
    38. public void onStartTrackingTouch(SeekBar seekBar) {
    39. }
    40. @Override
    41. public void onStopTrackingTouch(SeekBar seekBar) {
    42. }
    43. });
    44. // SEEKBAR ONE - PROZENT
    45. seekBarTwo = findViewById(R.id.seekBarProzent);
    46. seekBarTwo.setMax(max_prozent);
    47. seekBarTwo.setProgress(min_prozent);
    48. seekBarTwo.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
    49. @Override
    50. public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
    51. textViewTwo = findViewById(R.id.viewProzentEingabe);
    52. textViewTwo.setText(Integer.toString(progress));
    53. }
    54. @Override
    55. public void onStartTrackingTouch(SeekBar seekBar) {
    56. }
    57. @Override
    58. public void onStopTrackingTouch(SeekBar seekBar) {
    59. }
    60. });
    61. }
    62. }
    Alles anzeigen

    Ich spiele immer noch einwenig rum und probiere aus bzw. versuche selber auf die Lösung zu kommen, aber irgendwie will das Ganze nicht so wie ich will und sobald ich dann die App starte, schmiert Sie mir ab :(

    Würde mich über einen Denkanstoss sehr freuen......

  • Hallo also da sind auf die Schnelle betrachtet einige Fehler drin.

    Du scheinst Probleme mit „String“ und“ int“ zu haben.


    Zeile 19: geht so nicht. Was du da eventuell zurück bekommst ist die Objektinstanz als String willst du bestimmt nicht. Denke u willst auf den Progress Werst zugreifen .
    String milliliter = String.valueOf(seekBarOne.getProgress());


    Zeile 20: das gleiche


    Zeile 30: „setText()“ erwartet einen String keinen int

    textViewThree.setText(String.valueOf(basis));


    Zeile 34,38, das gleiche
    Ein Feedback auf Tipps ist auch schön. :P
  • Habe es zwischenzeitlich mal abgeändert.

    Quellcode

    1. public void generateResult (int progress){
    2. textViewThree = findViewById(R.id.viewResultBasis);
    3. textViewFour = findViewById(R.id.viewResult);
    4. berechnung = menge_in_ml / 100;
    5. berechnung1 = berechnung * prozent;
    6. String test = String.valueOf(menge_in_ml);
    7. String test1 = String.valueOf(berechnung1);
    8. textViewThree.setText(String.valueOf(test));
    9. textViewFour.setText(String.valueOf(test1));
    10. }
    Alles anzeigen

    Bewege ich jetzt die SeekBars, werden die Werte angezeigt wie es sein soll. ABER wenn ich damit "rechnen" möchte, passiert nichts. Es wird "0" (unter test1) angezeigt.
    Nehme ich die Berechnung raus, wird der einfach Wert der SeekBar angezeigt. Irgendwie habe ich ein Problem in der Formel bzw. Berechnung :/
  • Leider wieder falsch.
    textViewThree.setText(String.valueOf(test));
    test ist schon ein String.
    String.valueOf(test1) will einen int und kein String;


    textViewThree.setText(test);
    textViewFour.setText(test1);

    Schaue dir an von welchen Typ deine Variablen sind.
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von jogimuc ()

  • Dass hatte ich vergesse wieder rauszunehmen, gab keinen Fehler, deswegen bin ich da nicht mehr drüber gestolpert. Danke dir aber für den Hinweis.

    Aktuell sieht mein Problem wie folgt aus,...…

    ich habe 2 SeekBars.

    Mit einer kann man "ml" einstellen und mit der anderen "Prozent".
    In "viewMengeEingabe & viewProzentEingabe" wird jeweils die aktuelle Einstellung (ml & Prozent) angezeigt.

    In "viewResultBasis" sollen die ml abzüglich der prozentualen ml angezeigt werden.

    Bsp.

    SeekBarOne (ml) = 30ml -> Anzeige in "viewMengeEingabe"
    SeekBarTwo (%) = 8% -> Anzeige in "viewProzentEingabe"

    Rechenweg: 30ml / 100 * 8% = 2,4ml

    "viewResultBasis" soll somit in diesem Fall 27,6ml anzeigen und "viewResultAroma" die "2,4ml".

    Wenn ich nun aber die App starte und die SeekBars verschiebe, passiert erstmal nichts. Erst wenn ich die erste SeekBar auf 100ml schiebe und dann die zweite verschiebe,
    passiert dass was passieren soll, aber eben NUR wenn ich den ersten Regler auf 100ml lasse :/

    Irgendwie stolpere ich gerade nicht drüber, warum sich vorher nichts tut :/

    Edit: Ich glaube das Problem war/ist der Typ des Wertes. Alleine bei 100 werden ganze Zahlen angezeigt, da drunter Kommazahlen. Oder sehe ich dass gerade falsch!? :/
    Kommazahlen werden einfach nur mit *.0 angezeigt. Der Wert geht z.b. nicht auf 0.1 oder ähnliches.

    Ich denke ich bin auf dem richtigen Weg :)

    Quellcode

    1. public class MainActivity extends AppCompatActivity {
    2. static int max_ml = 100;
    3. static int max_prozent = 100;
    4. static int min_prozent = 1;
    5. private int menge_in_ml, aroma_in_prozent, berechnung, berechnung1, aroma, basis;
    6. TextView textViewOne, textViewTwo, textViewThree, textViewFour, textViewFive;
    7. SeekBar seekBarOne, seekBarTwo;
    8. public void generateResult (int progress){
    9. textViewThree = findViewById(R.id.viewResultBasis);
    10. textViewFour = findViewById(R.id.viewResultAroma);
    11. berechnung = menge_in_ml / 100;
    12. berechnung1 = berechnung * aroma_in_prozent;
    13. String test = String.valueOf(menge_in_ml - berechnung1);
    14. String test1 = String.valueOf(berechnung1);
    15. textViewThree.setText(test);
    16. textViewFour.setText(test1);
    17. }
    18. @Override
    19. protected void onCreate(Bundle savedInstanceState) {
    20. super.onCreate(savedInstanceState);
    21. setContentView(R.layout.activity_main);
    22. // SEEKBAR ONE - MILLILITER
    23. seekBarOne = findViewById(R.id.seekBarMenge);
    24. seekBarOne.setMax(max_ml);
    25. seekBarOne.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
    26. @Override
    27. public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
    28. textViewOne = findViewById(R.id.viewMengeEingabe);
    29. menge_in_ml = progress;
    30. generateResult(menge_in_ml);
    31. textViewOne.setText(Integer.toString(progress));
    32. }
    33. @Override
    34. public void onStartTrackingTouch(SeekBar seekBar) {
    35. }
    36. @Override
    37. public void onStopTrackingTouch(SeekBar seekBar) {
    38. }
    39. });
    40. // SEEKBAR ONE - PROZENT
    41. seekBarTwo = findViewById(R.id.seekBarAroma);
    42. seekBarTwo.setMax(max_prozent);
    43. seekBarTwo.setProgress(min_prozent);
    44. seekBarTwo.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
    45. @Override
    46. public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
    47. textViewTwo = findViewById(R.id.viewProzentEingabe);
    48. aroma_in_prozent = progress;
    49. generateResult(aroma_in_prozent);
    50. textViewTwo.setText(Integer.toString(progress));
    51. }
    52. @Override
    53. public void onStartTrackingTouch(SeekBar seekBar) {
    54. }
    55. @Override
    56. public void onStopTrackingTouch(SeekBar seekBar) {
    57. }
    58. });
    59. }
    60. }
    Alles anzeigen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Headhunter_1337 ()

  • Das liegt wahrscheinlich daran, das aroma_in_prozent oder menge_in_ml zu dem Zeitpunkt der ersten Verschiebung noch keinen Wert haben. (Der Standardwert fehlt hier. Dafür könntest du mal debuggen und schauen wie die Werte aussehen, wenn die Methode aufgerufen wird.)
    Alternativ kannst du die Werte statt zu speichern auch direkt auslesen (int value = seekBar.getProgress();).
    Zudem solltest du double statt int benutzen, da du als Ergebnis sonst nur gerundete Werte (die dann leicht abweichen) bekommst.
    Außerdem ist dein Parameter "int progress" im Moment über.
  • Falls du es wirklich nicht hinbekommst, hier die Lösung:
    Allerdings solltest du dir wirklich nochmal die Java-Basics zu Herzen nehmen und nochmal lernen richtig zu debuggen.
    Denn mit Typen (Strings, Int etc.) und Methoden (Rückgabe-Werte/Parameter) richtig um zu gehen, sind komplette Basics und das sollte man schon als Vorraussetzung für Android-Programmierung nehmen.
    Am besten nochmal Basic Java Tutorials anschauen. (Ich kann da zum Beispiel Video2Brain sehr empfehlen ! )

    Spoiler anzeigen

    Java-Quellcode

    1. public class MainActivity extends AppCompatActivity {
    2. SeekBar seekbarML, seekBarAroma;
    3. TextView textViewResult, textViewML, textViewAroma;
    4. @Override
    5. protected void onCreate(Bundle savedInstanceState) {
    6. super.onCreate(savedInstanceState);
    7. setContentView(R.layout.activity_main);
    8. textViewResult = findViewById(R.id.textViewResult);
    9. textViewML = findViewById(R.id.textViewML);
    10. textViewAroma = findViewById(R.id.textViewAroma);
    11. seekbarML = findViewById(R.id.seekBarML);
    12. seekbarML.setMax(100);
    13. seekbarML.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
    14. @Override
    15. public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
    16. //Ergebnis neu berechnen
    17. generateResult();
    18. }
    19. @Override
    20. public void onStartTrackingTouch(SeekBar seekBar) { }
    21. @Override
    22. public void onStopTrackingTouch(SeekBar seekBar) { }
    23. });
    24. seekBarAroma = findViewById(R.id.seekBarAroma);
    25. seekBarAroma.setMax(100);
    26. seekBarAroma.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
    27. @Override
    28. public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
    29. //Ergebnis neu berechnen
    30. generateResult();
    31. }
    32. @Override
    33. public void onStartTrackingTouch(SeekBar seekBar) { }
    34. @Override
    35. public void onStopTrackingTouch(SeekBar seekBar) { }
    36. });
    37. }
    38. public void generateResult(){
    39. //Ergebnis-Berechnung (Beispiel: 30(ml) / 100 * 8(%Aroma) = 2.4)
    40. double result = ((double)seekbarML.getProgress() / 100) * (double)seekBarAroma.getProgress();
    41. //Ergebnis ausgeben
    42. textViewResult.setText("Ergebnis: " + result + "%");
    43. textViewML.setText("ML: " + seekbarML.getProgress());
    44. textViewAroma.setText("Aroma: " + seekBarAroma.getProgress());
    45. }
    46. }
    Alles anzeigen
  • @Xcreen, danke dir. Ich habe mir die Lösung jetzt mal noch nicht angeschaut. In double hatte ich die Werte schon geändert. Wie gesagt, ich komme der Sache näher ^^ Jetzt wird auch soweit alles so angeschaut wie ich es eigentlich möchte. Einziges Problem jetzt noch, es werden gefühlte 20 Stellen nach Komma angezeigt :D

    Die Basics werde ich mir auch nochmal anschauen, im großen und ganzen kann/konnte ich einiges schon. Aber ich verlerne sehr schnell wenn ich längere Zeit nicht bei bin. Deswegen mache ich dann so einen Spielkram um (schnell(er)) wieder reinzukommen.
  • Hallo du übergibst zwar in der Zeil4 64 ,95 einen Wert an die Methode „generateResult“ .
    Aber in der Methode wird der Wert gar nicht benutzt, ist somit auch sinnlos einen Wert zu übergeben.

    wo und wie fragst du denn deine Progress werte ab?

    einen Anfangs wert für die erste seekbar setzt du nicht somit ist er 0
    und "berechnung = menge_in_ml / 100;" 0 / 100 in ganze Zahl "int" ist 0, auch 90/100 ist 0,9 und als "int" ist es 0
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von jogimuc ()

  • wenn du nicht alle nach Kommas haben willst dan Runde .


    float f = 1.987678F;
    float f_neu = Math.round(f * 100) / 100.0;

    = 1.99

    das mit Mal 100 und Durch 100 musst du machen da "Math.round" auf ohne Komma Rundet
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von jogimuc ()