Android Studio skapa en enkel miniräknare

Permalänk

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>

Permalänk
Hedersmedlem

Vad händer? Och vad är CalculatorActivity?

Permalänk

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.

Permalänk
Medlem
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

Permalänk
Medlem
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.

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB

Permalänk
Hedersmedlem

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

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

Permalänk

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?

Permalänk
Medlem
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.

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB

Permalänk

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;

Permalänk

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.

Permalänk
Hedersmedlem

@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.

Permalänk
Medlem

@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); }

Permalänk

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.

Permalänk
Medlem

@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("") --> ???

Permalänk
Medlem

@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)