Android Studio skapa en enkel miniräknare

Trädvy Permalänk
Medlem
Plats
Gävle
Registrerad
Sep 2005

Android Studio skapa en enkel miniräknare

Jag har en uppgift där jag ska skapa en enkel miniräknare som bara ska bestå av två textinput-fält ett resultat-fält och fem st knappar (+,-,*,/, clear) Jag har fått till layouten som det var beskrivet men själva funktionen får jag inte till. Jag har försökt att börja med additionen men det tar stopp direkt, vad gör jag för fel?

MainActivity.java

import android.content.Intent; import android.renderscript.Double2; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button_about = (Button) findViewById(R.id.button_about); button_about.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast toast = Toast.makeText(MainActivity.this, "This is my calculator", Toast.LENGTH_LONG); toast.show(); } }); Button button_start_calculator = (Button) findViewById(R.id.button_start_calculator); button_start_calculator.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(MainActivity.this, CalculatorActivity.class); startActivity(intent); } }); Button button1 = (Button) findViewById(R.id.button1); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { double result = 0; EditText editText1 = (EditText) findViewById(R.id.input_textfield1); EditText editText2 = (EditText) findViewById(R.id.input_textfield2); TextView result_output = (TextView) findViewById(R.id.result); double input1 = Double.parseDouble(editText1.getText().toString()); double input2 = Double.parseDouble(editText2.getText().toString()); result = input1 + input2; result_output.setText(input1+input2); } });

xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".CalculatorActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:gravity="center"> <EditText android:gravity="center" android:layout_width="100dp" android:layout_height="wrap_content" android:id="@+id/input_textfield1" android:text="Input 1" /> <EditText android:gravity="center" android:layout_width="100dp" android:layout_height="wrap_content" android:id="@+id/input_textfield2" android:text="Input 2" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center"> <TextView android:layout_width="300dp" android:layout_height="50dp" android:id="@+id/result" android:text="@string/result" android:gravity="center" /> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="match_parent" android:orientation="horizontal"> <Button android:layout_width="75dp" android:layout_height="wrap_content" android:text="@string/button_addition" android:id="@+id/button1" /> <Button android:layout_width="75dp" android:layout_height="wrap_content" android:text="@string/button_subtraction" android:id="@+id/button2" /> <Button android:layout_width="75dp" android:layout_height="wrap_content" android:text="@string/button_multiplication" android:id="@+id/button3" /> <Button android:layout_width="75dp" android:layout_height="wrap_content" android:text="@string/button_divide" android:id="@+id/button4" /> <Button android:layout_width="75dp" android:layout_height="wrap_content" android:text="@string/button_clear" android:id="@+id/button5" /> </LinearLayout> </LinearLayout>

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Apr 2004

Vad händer? Och vad är CalculatorActivity?

Trädvy Permalänk
Medlem
Plats
Gävle
Registrerad
Sep 2005

Jag har MainActivity.java och CalculatorActivity.java, MainActivity.java har bara två knappar där den ena öppnar upp själva "Calculator-delen". Men jag kanske skulle ha skrivit in koden som rör calculatorn i CalculatorActivity?

Jag har provat att flytta över för att se om det blir någon skillnad men det blir samma sak. Det som felar för mig är:

public void onClick(View view) { double result = 0; EditText editText1 = (EditText) findViewById(R.id.input_textfield1); EditText editText2 = (EditText) findViewById(R.id.input_textfield2); TextView result_output = (TextView) findViewById(R.id.result); double input1 = Double.parseDouble(editText1.getText().toString()); double input2 = Double.parseDouble(editText2.getText().toString()); result = input1 + input2; result_output.setText(result); } });

Den sista raden blir röd hela tiden, jag kan altså inte addera input1 och input2 och få dessa att visas i resultat-fältet. Jag får upp ett tips att jag kan kasta till int istället men det funkar inte heller. Har även försökt casta igen till double med samma resultat.

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Nov 2009
Skrivet av burton666:

Jag har MainActivity.java och CalculatorActivity.java, MainActivity.java har bara två knappar där den ena öppnar upp själva "Calculator-delen". Men jag kanske skulle ha skrivit in koden som rör calculatorn i CalculatorActivity?

Jag har provat att flytta över för att se om det blir någon skillnad men det blir samma sak. Det som felar för mig är:

public void onClick(View view) { double result = 0; EditText editText1 = (EditText) findViewById(R.id.input_textfield1); EditText editText2 = (EditText) findViewById(R.id.input_textfield2); TextView result_output = (TextView) findViewById(R.id.result); double input1 = Double.parseDouble(editText1.getText().toString()); double input2 = Double.parseDouble(editText2.getText().toString()); result = input1 + input2; result_output.setText(result); } });

Den sista raden blir röd hela tiden, jag kan altså inte addera input1 och input2 och få dessa att visas i resultat-fältet. Jag får upp ett tips att jag kan kasta till int istället men det funkar inte heller. Har även försökt casta igen till double med samma resultat.

Det är för att du försöker göra setText(double) på din TextView, setText kan inte ta en double som parameter utan du måste göra om det till en sträng på något vis.

Exempelvis

result_output.setText("Resultat: "+ (input1 + input2));

Så att du ger en string istället. Dock så har du redan räknat ut input1+input2 i din result variabel

Trädvy Permalänk
Medlem
Registrerad
Maj 2013
Skrivet av burton666:

Jag har MainActivity.java och CalculatorActivity.java, MainActivity.java har bara två knappar där den ena öppnar upp själva "Calculator-delen". Men jag kanske skulle ha skrivit in koden som rör calculatorn i CalculatorActivity?

Jag har provat att flytta över för att se om det blir någon skillnad men det blir samma sak. Det som felar för mig är:

public void onClick(View view) { double result = 0; EditText editText1 = (EditText) findViewById(R.id.input_textfield1); EditText editText2 = (EditText) findViewById(R.id.input_textfield2); TextView result_output = (TextView) findViewById(R.id.result); double input1 = Double.parseDouble(editText1.getText().toString()); double input2 = Double.parseDouble(editText2.getText().toString()); result = input1 + input2; result_output.setText(result); } });

Den sista raden blir röd hela tiden, jag kan altså inte addera input1 och input2 och få dessa att visas i resultat-fältet. Jag får upp ett tips att jag kan kasta till int istället men det funkar inte heller. Har även försökt casta igen till double med samma resultat.

Prova skriva detta istället;

result = input1 + input2;
result_output.setText(String.valueOf(result));

Du lär alltså göra om din double till en sträng så result_output kan använda denna i setText.

M-ITX: Fractal Design Node 304 Gigabyte H97N i7 4790k Msi GTX980 Gaming Ballistix Sport 16GB @ 1600MHz

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Apr 2004

setText vill nog ha en textsträng som argument, så testa

result_output.setText(Double.toString(result));

Trädvy Permalänk
Medlem
Plats
Gävle
Registrerad
Sep 2005

Tackar, nu funkar den delen iallafall. En till fråga bara, som det ser ut nu så står det redan input1 och input2 EditText-fältena. Hur gör man så att texten försvinner när man klickar/trycker på fältet?

Trädvy Permalänk
Medlem
Registrerad
Maj 2013
Skrivet av burton666:

Tackar, nu funkar den delen iallafall. En till fråga bara, som det ser ut nu så står det redan input1 och input2 EditText-fältena. Hur gör man så att texten försvinner när man klickar/trycker på fältet?

Kolla om fältet får fokus & texten är default -> Ta bort texten.
Kolla om fältet tappar fokus & texten är ""-> Lägg till texten.

*EDIT*
Använd setHint(String) istället.

M-ITX: Fractal Design Node 304 Gigabyte H97N i7 4790k Msi GTX980 Gaming Ballistix Sport 16GB @ 1600MHz

Trädvy Permalänk
Medlem
Plats
Gävle
Registrerad
Sep 2005

Jag har stött på ytterligare ett problem. Jag har en knapp som ska rensa alla fält och det funkar bra så länge som inte något fält är tomt, då crachar appen.

Jag har provat en massa olika sätt för att kolla om fältet är tomt eller inte men får inte till det. Räknas fältet som tomt förresten när man använder hint?

case R.id.button5: if (!editText1.getText().toString().isEmpty() || !editText2.getText().toString().isEmpty()) { result_output.setText(""); editText1.getText().clear(); editText2.getText().clear(); } break;

Trädvy Permalänk
Medlem
Plats
Gävle
Registrerad
Sep 2005

Jag har även provat:

case R.id.button5: editText1.setText(""); editText2.setText(""); result_output.setText(""); break;

Men så fort EditText-fieldsen har är tomma och visar android.hint-värdet så krachar appen när jag trycker på knappen.

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Apr 2004

@burton666 vänj dig gärna vid att läsa de felmeddelanden som ges. Förmodligen står det på vilken rad saker går fel och vad som är problemet.

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Nov 2009

@burton666

Det är antagligen ditt scope som är felaktigt, beroende på vart du lagt din switch-case men den ligger antaglingen inte samma onclick som för en annan knapp
Du har ett ganska begränsat scope eftersom du gör:

button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { double result = 0; EditText editText1 = (EditText) findViewById(R.id.input_textfield1); EditText editText2 = (EditText) findViewById(R.id.input_textfield2); TextView result_output = (TextView) findViewById(R.id.result); double input1 = Double.parseDouble(editText1.getText().toString()); double input2 = Double.parseDouble(editText2.getText().toString()); result = input1 + input2; result_output.setText(input1+input2); }

Trädvy Permalänk
Medlem
Plats
Gävle
Registrerad
Sep 2005

Jag förstår inte riktigt vad jag ska ändra, så här ser koden ut:

public class CalculatorActivity extends AppCompatActivity implements View.OnClickListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_calculator); Button button1 = (Button) findViewById(R.id.button1); Button button2 = (Button) findViewById(R.id.button2); Button button3 = (Button) findViewById(R.id.button3); Button button4 = (Button) findViewById(R.id.button4); Button button5 = (Button) findViewById(R.id.button5); button1.setOnClickListener(this); button2.setOnClickListener(this); button3.setOnClickListener(this); button4.setOnClickListener(this); button5.setOnClickListener(this); } @Override public void onClick(View v) { EditText editText1 = (EditText) findViewById(R.id.input_textfield1); EditText editText2 = (EditText) findViewById(R.id.input_textfield2); TextView result_output = (TextView) findViewById(R.id.result_field); double input1 = Double.parseDouble(editText1.getText().toString()); double input2 = Double.parseDouble(editText2.getText().toString()); switch (v.getId()) { case R.id.button1: result_output.setText(String.valueOf(input1 + input2)); break; case R.id.button2: result_output.setText(String.valueOf(input1 - input2)); break; case R.id.button3: result_output.setText(String.valueOf(input1 * input2)); break; case R.id.button4: result_output.setText(String.valueOf(input1 / input2)); break; case R.id.button5: editText1.setText(""); editText2.setText(""); result_output.setText(""); break; default: break; } } }

Och det här kommer upp i loggen när appen krachar:

--------- beginning of crash
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.ntn15cko.mycalculator, PID: 2457
java.lang.NumberFormatException: empty String
at java.lang.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1071)
at java.lang.Double.parseDouble(Double.java:547)
at com.example.ntn15cko.mycalculator.CalculatorActivity.onClick(CalculatorActivity.java:39)
at android.view.View.performClick(View.java:5610)
at android.view.View$PerformClick.run(View.java:22265)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

Vad jag förstår så försöker jag sätta ett tomt fält till en tom string? Jag har försökt en massa olika if satser som if editText1.toString.eqials("") samt editText1.toString == "" och .isEmpty. Men jag får inget att fungera.

Edit: Ahh, parseDouble jag behöver antagligen checka om fältet är tomt innan parseDouble körs, ska provas.

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Nov 2009

@burton666:

double input1 = Double.parseDouble(editText1.getText().toString()); double input2 = Double.parseDouble(editText2.getText().toString());

double exampleOne Double.parsedouble("4.5") --> 4.5 double exampleTwo Double.parsedouble("0.0") --> 0.0 double exampleThree Double.parsedouble("") --> ???

Trädvy Permalänk
Medlem
Plats
Lund
Registrerad
Sep 2003

@burton666

Felmeddelandet säger exakt vad felet är och vilken rad. Det står att du får NumberFormatException pga att du skickar in en tom sträng i Double.parseDouble() på rad 39 i CalculatorActivity.
Oftast ger logcat ganska tydliga svar på varför det kraschar så titta alltid loggen först, det kan spara dig massa tid

Fetmarkerar här vart i loggen du kan läsa ut de viktiga delarna. Ett tips är att du i logcatten i android studio även kan trycka på "CalculatorActivity.java:39" för att komma direkt till den raden

java.lang.NumberFormatException: empty String at java.lang.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1071) at java.lang.Double.parseDouble(Double.java:547) at com.example.ntn15cko.mycalculator.CalculatorActivity.onClick(CalculatorActivity.java:39)