In: Computer Science
Murach Android tip calculator event handling assignment
//MainActivity.java
package com.thephoenixzone.murachtipcalculator;
import androidx.appcompat.app.AppCompatActivity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import java.text.NumberFormat;
public class MainActivity extends AppCompatActivity implements TextView.OnEditorActionListener, View.OnClickListener {
    // define variables for the widgets
    private EditText etbillAmount;
    private TextView txtPercent;
    private Button btnPercentUp;
    private Button   btnPercentDown;
    private TextView txtTip;
    private TextView txtTotal;
    // define the SharedPreferences object
    private SharedPreferences savedValues;
    // define instance variables that should be saved
    private String billAmount = "";
    private float tipPercent = .10f;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // get references to the widgets
        etbillAmount = (EditText) findViewById(R.id.billAmountEditText);
        txtPercent = (TextView) findViewById(R.id.percentTextView);
        btnPercentUp = (Button) findViewById(R.id.percentUpButton);
        btnPercentDown = (Button) findViewById(R.id.percentDownButton);
        txtTip = (TextView) findViewById(R.id.tipTextView);
        txtTotal = (TextView) findViewById(R.id.totalTextView);
        // set the listeners
        etbillAmount.setOnEditorActionListener(this);
        btnPercentUp.setOnClickListener(this);
        btnPercentDown.setOnClickListener(this);
        // get SharedPreferences object
        savedValues = getSharedPreferences("SavedValues", MODE_PRIVATE);
    }
    @Override
    public void onPause() {
        // save the instance variables
        SharedPreferences.Editor editor = savedValues.edit();
        editor.putString("billAmount", billAmount);
        editor.putFloat("tipPercent", tipPercent);
        editor.commit();
        super.onPause();
    }
    @Override
    public void onResume() {
        super.onResume();
        // get the instance variables
        billAmount = savedValues.getString("billAmount", "");
        tipPercent = savedValues.getFloat("tipPercent", 0.15f);
        // set the bill amount on its widget
        etbillAmount.setText(billAmount);
        // calculate and display
        calculateAndDisplay();
    }
    public void calculateAndDisplay() {
        // get the bill amount
        billAmount = etbillAmount.getText().toString();
        float billAmount1;
        if (billAmount.equals("")) {
            billAmount1 = 0;
        }
        else {
            billAmount1 = Float.parseFloat(billAmount);
        }
        // calculate tip and total
        float tipAmount = billAmount1 * tipPercent;
        float totalAmount = billAmount1 + tipAmount;
        // display the other results with formatting
        NumberFormat currency = NumberFormat.getCurrencyInstance();
        txtTip.setText(currency.format(tipAmount));
        txtTotal.setText(currency.format(totalAmount));
        NumberFormat percent = NumberFormat.getPercentInstance();
        txtPercent.setText(percent.format(tipPercent));
    }
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_DONE ||
                actionId == EditorInfo.IME_ACTION_UNSPECIFIED) {
            calculateAndDisplay();
        }
        return false;
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.percentDownButton:
                tipPercent = tipPercent - .01f;
                calculateAndDisplay();
                break;
            case R.id.percentUpButton:
                tipPercent = tipPercent + .01f;
                calculateAndDisplay();
                break;
        }
    }
}
//activity_main.xml
<RelativeLayout 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:padding="10dp" >
    <!-- The bill amount -->
    <TextView
        android:id="@+id/billAmountLabel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:text="@string/bill_amount_label"
        android:textSize="20sp"
        android:textStyle="bold" />
    <EditText
        android:id="@+id/billAmountEditText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/billAmountLabel"
        android:layout_marginLeft="5dp"
        android:layout_toRightOf="@+id/billAmountLabel"
        android:ems="8"
        android:inputType="numberDecimal"
        android:text="@string/bill_amount"
        android:textSize="20sp" >
        <requestFocus />
    </EditText>
    <!-- The tip percent -->
    <TextView
        android:id="@+id/percentLabel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/billAmountLabel"
        android:layout_below="@+id/billAmountLabel"
        android:padding="10dp"
        android:text="@string/tip_percent_label"
        android:textSize="20sp"
        android:textStyle="bold" />
    <TextView
        android:id="@+id/percentTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/percentLabel"
        android:layout_alignLeft="@+id/billAmountEditText"
        android:padding="5dp"
        android:text="@string/tip_percent"
        android:textSize="20sp" />
    <Button
        android:id="@+id/percentDownButton"
        android:layout_width="45dp"
        android:layout_height="45dp"
        android:layout_alignBaseline="@+id/percentTextView"
        android:layout_marginLeft="25dp"
        android:layout_toRightOf="@+id/percentTextView"
        android:text="@string/decrease"
        android:textSize="20sp" />
    <Button
        android:id="@+id/percentUpButton"
        android:layout_width="45dp"
        android:layout_height="45dp"
        android:layout_alignBaseline="@+id/percentDownButton"
        android:layout_toRightOf="@+id/percentDownButton"
        android:text="@string/increase"
        android:textSize="20sp" />
    <!-- the tip amount -->
    <TextView
        android:id="@+id/tipLabel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/percentLabel"
        android:layout_below="@+id/percentLabel"
        android:padding="10dp"
        android:text="@string/tip_amount_label"
        android:textSize="20sp"
        android:textStyle="bold" />
    <TextView
        android:id="@+id/tipTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/tipLabel"
        android:layout_alignLeft="@id/billAmountEditText"
        android:padding="5dp"
        android:text="@string/tip_amount"
        android:textSize="20sp" />
    <!-- the total -->
    <TextView
        android:id="@+id/totalLabel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/tipLabel"
        android:layout_below="@+id/tipLabel"
        android:padding="10dp"
        android:text="@string/total_amount_label"
        android:textSize="20sp"
        android:textStyle="bold" />
    <TextView
        android:id="@+id/totalTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/totalLabel"
        android:layout_alignLeft="@+id/tipTextView"
        android:padding="5dp"
        android:text="@string/total_amount"
        android:textSize="20sp" />
</RelativeLayout>
//strings.xml
<resources>
    <string name="app_name">MurachTipCalculator</string>
    <string name="title_activity_tip_calculator">Tip Calculator</string>
    <string name="menu_settings">Settings</string>
    <string name="bill_amount_label">Bill Amount</string>
    <string name="bill_amount"></string>
    <string name="tip_percent_label">Percent</string>
    <string name="tip_percent">15%</string>
    <string name="increase">+</string>
    <string name="decrease">-</string>
    <string name="tip_amount_label">Tip</string>
    <string name="tip_amount">$0.00</string>
    <string name="total_amount_label">Total</string>
    <string name="total_amount">$0.00</string>
</resources>
//Output
