0

The problem has something to do with the set visibility in the updateInputsVisibility() function.

package com.example.myweighttrackingapp;

import static android.view.View.VISIBLE;
import static com.example.myweighttrackingapp.BMICalculator.BMI_CATEGORY_HEALTHY;
import static com.example.myweighttrackingapp.BMICalculator.BMI_CATEGORY_OBESE;
import static com.example.myweighttrackingapp.BMICalculator.BMI_CATEGORY_OVERWEIGHT;
import static com.example.myweighttrackingapp.BMICalculator.BMI_CATEGORY_UNDERWEIGHT;

import android.annotation.SuppressLint;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ToggleButton;

import androidx.appcompat.app.AppCompatActivity;
import androidx.cardview.widget.CardView;

public class BMIScreen extends AppCompatActivity {
    private EditText weightKgEditText, heightCmEditText;
    private EditText weightLbsEditText, heightFtEditText, heightInEditText;
    private TextView bmiTextView, categoryTextView;
    private CardView bmiResultCardView;

    private boolean inMetricUnits = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        weightKgEditText = findViewById(R.id.activity_main_weightkgs);
        heightCmEditText = findViewById(R.id.activity_main_heightcm);

        weightLbsEditText = findViewById(R.id.activity_main_weightlbs);
        heightFtEditText = findViewById(R.id.activity_main_heightfeet);
        heightInEditText = findViewById(R.id.activity_main_heightinches);

        Button calculateBMI = findViewById(R.id.buttonCalculate);
        ToggleButton toggleUnitsButton = findViewById(R.id.activity_main_toggleunits);

        bmiTextView = findViewById(R.id.activity_main_bmi);
        categoryTextView = findViewById(R.id.activity_main_category);
        bmiResultCardView = findViewById(R.id.activity_main_resultcard);

        inMetricUnits = true;
        updateInputsVisibility();
        bmiResultCardView.setVisibility(View.GONE);

        calculateBMI.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (inMetricUnits) {
                    if (weightKgEditText.length() == 0 || heightCmEditText.length() == 0) {
                        Toast.makeText(BMIScreen.this, "Populate Weight and Height to Calculate BMI", Toast.LENGTH_SHORT).show();
                    } else {
                        double heightInCms = Double.parseDouble(heightCmEditText.getText().toString());
                        double weightInKgs = Double.parseDouble(weightKgEditText.getText().toString());
                        double bmi = BMICalculator.getInstance().calculateBMIMetric(heightInCms, weightInKgs);
                        displayBMI(bmi);
                    }
                } else {
                    if (weightLbsEditText.length() == 0 || heightFtEditText.length() == 0 || heightInEditText.length() == 0) {
                        Toast.makeText(BMIScreen.this, "Populate Weight and Height to Calculate BMI", Toast.LENGTH_SHORT).show();
                    } else {
                        double heightFeet = Double.parseDouble(heightFtEditText.getText().toString());
                        double heightInches = Double.parseDouble(heightInEditText.getText().toString());
                        double weightLbs = Double.parseDouble(weightLbsEditText.getText().toString());
                        double bmi = BMICalculator.getInstance().calculateBMIImperial(heightFeet, heightInches, weightLbs);
                        displayBMI(bmi);
                    }
                }
            }
        });

        toggleUnitsButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                inMetricUnits = !inMetricUnits;
                updateInputsVisibility();
            }
        });
    }

    public void updateInputsVisibility() {
        if (inMetricUnits) {
            heightCmEditText.setVisibility(View.VISIBLE);
            weightKgEditText.setVisibility(View.VISIBLE);
            heightFtEditText.setVisibility(View.GONE);
            heightInEditText.setVisibility(View.GONE);
            weightLbsEditText.setVisibility(View.GONE);
        } else {
            heightCmEditText.setVisibility(View.GONE);
            weightKgEditText.setVisibility(View.GONE);
            heightFtEditText.setVisibility(View.VISIBLE);
            heightInEditText.setVisibility(View.VISIBLE);
            weightLbsEditText.setVisibility(View.VISIBLE);
        }
    }

    @SuppressLint("DefaultLocale")
    private void displayBMI(double bmi) {
        bmiResultCardView.setVisibility(VISIBLE);

        bmiTextView.setText(String.format("%.2f", bmi));

        String bmiCategory = BMICalculator.getInstance().classifyBMI(bmi);
        categoryTextView.setText(bmiCategory);

        switch (bmiCategory) {
            case BMI_CATEGORY_UNDERWEIGHT:
                bmiResultCardView.setCardBackgroundColor(Color.YELLOW);
                break;
            case BMI_CATEGORY_HEALTHY:
                bmiResultCardView.setCardBackgroundColor(Color.GREEN);
                break;
            case BMI_CATEGORY_OVERWEIGHT:
                bmiResultCardView.setCardBackgroundColor(Color.YELLOW);
                break;
            case BMI_CATEGORY_OBESE:
                bmiResultCardView.setCardBackgroundColor(Color.RED);
                break;
        }
    }
}

I tried changing the edit texts to static and I tried adding a range to the visibility. I was expecting it to allow the BMI calculator to run however, it crashes every time I attempt to open it.

Here is the logcat:

2022-03-23 15:35:31.878 19167-19194/com.example.myweighttrackingapp E/eglCodecCommon: GoldfishAddressSpaceHostMemoryAllocator: ioctl_ping failed for device_type=5, ret=-1
2022-03-23 15:35:36.527 19167-19167/com.example.myweighttrackingapp E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.myweighttrackingapp, PID: 19167
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myweighttrackingapp/com.example.myweighttrackingapp.BMIScreen}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.EditText.setVisibility(int)' on a null object reference
at android.app.
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.EditText.setVisibility(int)' on a null object reference
at com.example.myweighttrackingapp.BMIScreen.updateInputsVisibility(BMIScreen.java:90)
at com.example.myweighttrackingapp.BMIScreen.onCreate(BMIScreen.java:50)
Paul R
  • 202,568
  • 34
  • 375
  • 539
Anonymous
  • 1
  • 1

0 Answers0