Ten post chciałbym poświęcić na opisanie sposobu wykonania prostego kalkulatora w Visual Studio Xamarin na Androida.
[Źrodlo: https://en.wikipedia.org/wiki/Xamarin]
Rozmieszczenie elementów:
Poniżej przedstawię rozmieszczenie poszczególnych fragmentów aplikacji.
Okno składa się z dwóch tablic z danymi (GridLayout). Górna tablica składa się z pojedynczych wierszy. Pierwszy wiersz zawiera numer dziesiętny, kolejny szesnastkowy, a ostatni binarny:
- <android.support.v7.widget.GridLayout
- android:layout_width="wrap_content"
- android:layout_height="0dp"
- android:layout_weight="1"
- android:background="#000001"
- android:textColor="#FFFFF0"
- app:orientation="horizontal"
- app:rowCount="3"
- app:columnCount="1">
- <TextView
- android:id="@+id/clcTextViewDec"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:padding="5dp"
- android:textSize="25sp"
- android:text="" />
- <TextView
- android:id="@+id/clcTextViewHex"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:padding="5dp"
- android:textSize="15sp"
- android:text="Hex:" />
- <TextView
- android:id="@+id/clcTextViewBin"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:padding="5dp"
- android:textSize="15sp"
- android:text="Bin:" />
- </android.support.v7.widget.GridLayout>
Przyciski są rozmieszczone w drugiej tablicy:
Tutaj wykorzystywane są dwa style dla przycisków:
- <?xml version="1.0" encoding="utf-8" ?>
- <resources>
- <style name="calcBtnStandardStyle">
- <item name="android:layout_width">0dp</item>
- <item name="android:layout_height">0dp</item>
- <item name="layout_rowWeight">1</item>
- <item name="layout_columnWeight">1</item>
- <item name="android:textSize">20dp</item>
- <item name="android:textColor">#FFFFF0</item>
- <item name="android:background">#000066</item>
- <item name="android:onClick">ButtonClick</item>
- </style>
- <style name="calcBtnExtraStyle">
- <item name="android:layout_width">0dp</item>
- <item name="android:layout_height">0dp</item>
- <item name="layout_rowWeight">1</item>
- <item name="layout_columnWeight">1</item>
- <item name="android:textSize">20dp</item>
- <item name="android:textColor">#FFFFF0</item>
- <item name="android:background">#2989D4</item>
- <item name="android:onClick">ButtonClick</item>
- </style>
- </resources>
Poniżej zdjęcie z android emulator w Visual Studio dla telefonu Nexus 6 oraz androida 7.1:
Na samej górze znajdują się trzy pola wypisujące liczby w formacie dziesiętnym, szesnastkowym oraz binarnym. Do obsługi są wprowadzone podstawowe operacje matematyczne. Klawisz opisany jako BAC czyści ostatni znak natomiast DEL usuwa wszystkie operacje. Pozostałe elementy są dosyć łatwe w zrozumieniu, wobec tego nie będę ich opisywał.
Należy pamiętać aby w pliku strings.xml znajdowała się dobra nazwa projektu:
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <string name="app_name">SimpleCalc</string>
- </resources>
Program:
Poniżej przejdę do opisu niektórych funkcji w programie. Na samym początku wywoływane jest okno do którego następuje
- protected override void OnCreate(Bundle savedInstanceState)
- {
- base.OnCreate(savedInstanceState);
- SetContentView(Resource.Layout.Main);
- calculatorText = FindViewById<TextView>(Resource.Id.clcTextViewDec);
- calculatorTextHex = FindViewById<TextView>(Resource.Id.clcTextViewHex);
- calculatorTextBin = FindViewById<TextView>(Resource.Id.clcTextViewBin);
- }
Następuje wygenerowanie i uruchomienie przygotowanych grafik. Po tym następuje przypisanie wartości tekstowych do odpowiednich rubryk wyświetlanych dla użytkownika.
Za odczytanie klikniętych przycisków odpowiada następująca funkcja:
- [Java.Interop.Export("ButtonClick")]
- public void ButtonClick(View v)
- {
- Button button = (Button)v;
- if(checkIfBtnDecOrPoint(button.Text))
- {
- decBtnClickedMethod(button.Text);
- }
- else if(checkIfBasicOperator(button.Text))
- {
- basicOperatorBtnClickedMethod(button.Text);
- }
- else if(checkIfEqualSignClicked(button.Text))
- {
- equalOoperatorBtnClickedMethod();
- }
- else if(checkIfSpecialOperator(button.Text))
- {
- specialOperatorBtnClickedMethod(button.Text);
- }
- else if(checkIfMultipleZeroClicked(button.Text))
- {
- multipleZerosBtnClickedMethod(button.Text);
- }
- else if(checkIfBackSignClicked(button.Text))
- {
- clearLastDigitBtnClickedMethod();
- }
- else
- {
- clearScreen();
- }
- }
W zależności który klawisz został kliknięty następuje przejście do przygotowanej funkcji odpowiedzialnej za wykonanie operacji matematycznej:
- private void CalculateData(string newOperator = null)
- {
- double? result = null;
- double? first = passNumbers[0] == null ? null : (double?)double.Parse(passNumbers[0]);
- double? second = passNumbers[1] == null ? null : (double?)double.Parse(passNumbers[1]);
- switch (@operator)
- {
- case MathOpAdd:
- result = first + second;
- break;
- case MathOpDiv:
- result = first / second;
- break;
- case MathOpMult:
- result = first * second;
- break;
- case MathOpSub:
- result = first - second;
- break;
- case MathOpExponen2:
- result = first * first;
- break;
- case MathOpExponen3:
- result = first * first * first;
- break;
- case MathOpDeflect:
- result = 1 / first;
- break;
- case MathOpRoot2:
- result = Math.Sqrt((double)first);
- break;
- case MathOpRoot3:
- result = Math.Pow((double)first, (1.0 / 3.0));
- break;
- }
- setDataIfNoResult(result, newOperator);
- }
Wyświetlanie danych na ekranie odbywa się za pomocą następującej funkcji:
- private void CalcTextUpdate()
- {
- int number1Tmp = 0;
- int number2Tmp = 0;
- string number1TmpSt = "";
- string number2TmpSt = "";
- if (int.TryParse(passNumbers[0], out number1Tmp))
- {
- number1TmpSt = number1Tmp.ToString("X");
- }
- if (int.TryParse(passNumbers[1], out number2Tmp))
- {
- number2TmpSt = number2Tmp.ToString("X");
- }
- calculatorText.Text = $"{passNumbers[0]} {@operator} {passNumbers[1]}";
- calculatorTextHex.Text = "Hex:" + $"{number1TmpSt} {@operator} {number2TmpSt}";
- calculatorTextBin.Text = "Bin:" + Convert.ToString(number1Tmp, 2) + $"{@operator}" + Convert.ToString(number2Tmp, 2);
- }
Projekt można pobrać pod tym linkiem z dysku Google.