From a348085743243aaabce4c0500c62930c36d80130 Mon Sep 17 00:00:00 2001 From: icewithcola Date: Tue, 9 Apr 2024 15:22:52 +0800 Subject: [PATCH] P3 finished --- app/src/main/AndroidManifest.xml | 7 +- .../java/uk/kagurach/android101/Kaculate.kt | 107 +++--- .../java/uk/kagurach/android101/Page3.java | 108 +++++- .../java/uk/kagurach/android101/Page4.java | 24 ++ app/src/main/res/layout/activity_page3.xml | 340 +++++++++--------- app/src/main/res/layout/activity_page4.xml | 10 + app/src/main/res/values/colors.xml | 3 + app/src/main/res/values/strings.xml | 2 +- 8 files changed, 383 insertions(+), 218 deletions(-) create mode 100644 app/src/main/java/uk/kagurach/android101/Page4.java create mode 100644 app/src/main/res/layout/activity_page4.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4cace37..177a87e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,7 +1,9 @@ - + + + + diff --git a/app/src/main/java/uk/kagurach/android101/Kaculate.kt b/app/src/main/java/uk/kagurach/android101/Kaculate.kt index 9bf48f7..10605a0 100644 --- a/app/src/main/java/uk/kagurach/android101/Kaculate.kt +++ b/app/src/main/java/uk/kagurach/android101/Kaculate.kt @@ -14,8 +14,7 @@ fun Kaculate(src: String,ctx :Context) : String{ var _curnum = "" - var _immediatePop = false - for (i in 0..array.size){ + throw IndexOutOfBoundsException() + } + + var newArray = floatArrayOf() + for (i in array.indices){ + if (i!=idx){ + newArray += array[i] + } + } + return newArray +} +private fun dropAtIdx(array: CharArray, idx:Int): CharArray{ + if (idx>array.size){ + throw IndexOutOfBoundsException() + } + + var newArray = charArrayOf() + for (i in array.indices){ + if (i!=idx){ + newArray += array[i] + } + } + return newArray } \ No newline at end of file diff --git a/app/src/main/java/uk/kagurach/android101/Page3.java b/app/src/main/java/uk/kagurach/android101/Page3.java index f81f7d5..93c37a7 100644 --- a/app/src/main/java/uk/kagurach/android101/Page3.java +++ b/app/src/main/java/uk/kagurach/android101/Page3.java @@ -2,12 +2,14 @@ package uk.kagurach.android101; import static uk.kagurach.android101.KaculateKt.Kaculate; +import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import androidx.activity.EdgeToEdge; +import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; @@ -35,14 +37,20 @@ public class Page3 extends AppCompatActivity { findViewById(R.id.P3_8).setOnClickListener(new CalculateOnClickListener()); findViewById(R.id.P3_9).setOnClickListener(new CalculateOnClickListener()); findViewById(R.id.P3BK).setOnClickListener(new CalculateOnClickListener()); + findViewById(R.id.P3X).setOnClickListener(new CalculateOnClickListener()); findViewById(R.id.P3Plus).setOnClickListener(new CalculateOnClickListener()); findViewById(R.id.P3Minus).setOnClickListener(new CalculateOnClickListener()); findViewById(R.id.P3Div).setOnClickListener(new CalculateOnClickListener()); + findViewById(R.id.P3ChengFang).setOnClickListener(new CalculateOnClickListener()); + findViewById(R.id.P3Dot).setOnClickListener(new CalculateOnClickListener()); findViewById(R.id.P3CE).setOnClickListener(new CalculateOnClickListener()); - findViewById(R.id.P3ChengFang).setOnClickListener(new CalculateOnClickListener()); + findViewById(R.id.P3EqualButton).setOnClickListener(new CalculateOnClickListener()); + + findViewById(R.id.P3Nextpage).setOnClickListener(new PageButtonHandler()); + findViewById(R.id.P3Nextpage).setOnLongClickListener(new LongClickHandler()); } @@ -53,28 +61,124 @@ public class Page3 extends AppCompatActivity { TextView tv = findViewById(R.id.P3CalcResult); String s = tv.getText().toString(); String o = ((Button)v).getText().toString(); + Button dot = findViewById(R.id.P3Dot); switch (o){ case "退格": if (!s.isEmpty()){ - s = s.substring(0,s.length()-1); + if (s.length()==1){ + s = ""; + dot.setEnabled(true); + setOpButton(true); + }else { + s = s.substring(0, s.length() - 1); + dot.setEnabled(!isNumberWithDot(s)); + setOpButton(s.substring(s.length()-1).matches("\\d|\\.")); + } } break; case "CE": s = ""; + dot.setEnabled(true); break; case "=": calc(); + s = tv.getText().toString(); + if (!s.contains(".")){ + dot.setEnabled(true); + } + setOpButton(true); + return; + case ".": + dot.setEnabled(false); + s+='.'; + break; default: s += o; + if (o.matches("\\d")) { // If inputted a number + setOpButton(true); + }else{ // Else an operator + dot.setEnabled(true); + setOpButton(false); + } } tv.setText(s); } } + private void setOpButton(boolean state){ + findViewById(R.id.P3X).setEnabled(state); + findViewById(R.id.P3Plus).setEnabled(state); + findViewById(R.id.P3Minus).setEnabled(state); + findViewById(R.id.P3Div).setEnabled(state); + findViewById(R.id.P3ChengFang).setEnabled(state); + } + + private boolean isNumberWithDot(@NonNull String s){ + if (!s.contains(".")){ + return false; + } + boolean hasDot = false; + for (int i = s.length()-1; i >= 0; i--) { + char c = s.charAt(i); + if (c=='+'||c=='-'||c=='x'||c=='/'||c=='^'){ + return hasDot; + }else if (c=='.'){ + hasDot = true; + } + } + return hasDot; + } + private void calc(){ TextView textView = findViewById(R.id.P3CalcResult); String result = Kaculate(textView.getText().toString(),this); + + if (result.contains(".")) { // In case of Infinity or NaN as a result + int i = 0; + while (result.charAt(i) != '.') { + i++; + } + int j = i; + boolean notZero = false; + for (i++; i < result.length(); i++) { + if (result.charAt(i) != '0') { + notZero = true; + } + } + + if (!notZero) { + result = result.substring(0, j); + } + } + textView.setText(result); } + + public void goNext() { + Intent myIntent = new Intent(this, Page4.class); + startActivity(myIntent); + } + + public void goPrev() { + Intent myIntent = new Intent(this, MainActivity2.class); + startActivity(myIntent); + } + final class PageButtonHandler implements View.OnClickListener + { + @Override + public void onClick(View v){ + goNext(); + } + } + + final class LongClickHandler implements View.OnLongClickListener + { + @Override + public boolean onLongClick(View v){ + goPrev(); + return false; + } + } + } \ No newline at end of file diff --git a/app/src/main/java/uk/kagurach/android101/Page4.java b/app/src/main/java/uk/kagurach/android101/Page4.java new file mode 100644 index 0000000..8d1300e --- /dev/null +++ b/app/src/main/java/uk/kagurach/android101/Page4.java @@ -0,0 +1,24 @@ +package uk.kagurach.android101; + +import android.os.Bundle; + +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; + +public class Page4 extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + setContentView(R.layout.activity_page4); + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { + Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); + return insets; + }); + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_page3.xml b/app/src/main/res/layout/activity_page3.xml index 5c5221c..c21faf3 100644 --- a/app/src/main/res/layout/activity_page3.xml +++ b/app/src/main/res/layout/activity_page3.xml @@ -6,196 +6,192 @@ android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".Page3"> - + android:orientation="vertical" + > - - - - - - -