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)