Gestational Age Calculator using DatePickerDialog



Here we will create a simple app which calculates the Gestational Age of a fetus during pregnancy, using the date of Last Menstrual Period(LMP). This app will use a DatePickerDialog for selecting the LMP.

Step 1: Create a new project with name ‘Gestational Age Calculator’ and package name com.myexample.appcompat.gestation. Fill the forms and click “Finish” button.

Step 2: In app level build.gradle add following dependencies:

dependencies {
	compile fileTree(dir: 'libs', include: ['*.jar'])
	compile 'com.android.support:appcompat-v7:27.0.2'
	compile 'com.android.support:design:27.0.2'
	compile 'com.android.support:support-v4:27.0.2'
}

Step 3: In drawable folder add image of a Calendar icon ‘calendar.png’.

Step 4: Open res -> layout -> xml (or) main.xml and add codes for displaying 4 EditText, an ImageView, and
Button.

<?xml version="1.0" encoding="utf-8"?>
<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"
	tools:context=".MainActivity">

	<ScrollView
		android:id="@+id/vscroll1"
		android:layout_width="match_parent"
		android:layout_height="match_parent">

		<LinearLayout
			android:id="@+id/linear1"
			android:layout_width="match_parent"
			android:layout_height="wrap_content"
			android:background="#FFFFFF"
			android:orientation="vertical">

			<LinearLayout
				android:id="@+id/linear4"
				android:layout_width="match_parent"
				android:layout_height="wrap_content"
				android:padding="8dp"
				android:orientation="horizontal">

				<TextView
					android:id="@+id/textview2"
					android:layout_width="wrap_content"
					android:layout_height="wrap_content"
					android:padding="8dp"
					android:text="LMP (first day of Last menstrual period): "
					android:textSize="18sp"
					android:textColor="#37474F"
					android:layout_weight="1"/>

				<EditText
					android:id="@+id/edittext1"
					android:layout_width="120dp"
					android:layout_height="wrap_content"
					android:layout_margin="8dp"
					android:padding="8dp"
					android:background="#B2DFDB"
					android:textSize="16sp"
					android:textColor="#000000"
					android:hint="Click here"
					android:textColorHint="#607D8B"
					android:enabled="false"/>

				<ImageView
					android:id="@+id/imageview1"
					android:layout_width="40dp"
					android:layout_height="40dp"
					android:layout_margin="8dp"
					android:src="@drawable/calendar"
					android:scaleType="fitXY"/>

			</LinearLayout>

			<LinearLayout
				android:id="@+id/linear6"
				android:layout_width="match_parent"
				android:layout_height="wrap_content"
				android:padding="8dp"
				android:orientation="horizontal">

				<TextView
					android:id="@+id/textview4"
					android:layout_width="wrap_content"
					android:layout_height="wrap_content"
					android:padding="8dp"
					android:text="Gestational Age (Today):"
					android:textSize="18sp"
					android:textColor="#37474F"
					android:layout_weight="1"/>

				<LinearLayout
					android:id="@+id/linear8"
					android:layout_width="wrap_content"
					android:layout_height="wrap_content"
					android:padding="8dp"
					android:orientation="vertical">

					<EditText
						android:id="@+id/edittext2"
						android:layout_width="80dp"
						android:layout_height="wrap_content"
						android:padding="8dp"
						android:background="#B2DFDB"
						android:textSize="18sp"
						android:textColor="#000000"
						android:textColorHint="#607D8B"
						android:enabled="false"/>

					<TextView
						android:id="@+id/textview6"
						android:layout_width="wrap_content"
						android:layout_height="wrap_content"
						android:padding="8dp"
						android:text="weeks"
						android:textSize="18sp"
						android:textColor="#37474F"/>

				</LinearLayout>

				<LinearLayout
					android:id="@+id/linear9"
					android:layout_width="wrap_content"
					android:layout_height="match_parent"
					android:padding="8dp"
					android:orientation="vertical">

					<EditText
						android:id="@+id/edittext3"
						android:layout_width="80dp"
						android:layout_height="wrap_content"
						android:padding="8dp"
						android:background="#B2DFDB"
						android:textSize="18sp"
						android:textColor="#000000"
						android:textColorHint="#607D8B"
						android:enabled="false"/>

					<TextView
						android:id="@+id/textview5"
						android:layout_width="wrap_content"
						android:layout_height="wrap_content"
						android:padding="8dp"
						android:text="days"
						android:textSize="18sp"
						android:textColor="#37474F"/>

				</LinearLayout>

			</LinearLayout>

			<LinearLayout
				android:id="@+id/linear10"
				android:layout_width="match_parent"
				android:layout_height="wrap_content"
				android:padding="8dp"
				android:orientation="horizontal">

				<TextView
					android:id="@+id/textview7"
					android:layout_width="wrap_content"
					android:layout_height="wrap_content"
					android:padding="8dp"
					android:text="EDD (Expected Date of Delivery), 40 weeks:"
					android:textSize="18sp"
					android:textColor="#37474F"
					android:layout_weight="1"/>

				<EditText
					android:id="@+id/edittext4"
					android:layout_width="120dp"
					android:layout_height="wrap_content"
					android:padding="8dp"
					android:background="#B2DFDB"
					android:textSize="16sp"
					android:textColor="#000000"
					android:textColorHint="#607D8B"
					android:enabled="false"/>

			</LinearLayout>

			<LinearLayout
				android:id="@+id/linear7"
				android:layout_width="match_parent"
				android:layout_height="wrap_content"
				android:padding="8dp"
				android:orientation="horizontal">

				<Button
					android:id="@+id/button2"
					android:layout_width="wrap_content"
					android:layout_height="wrap_content"
					android:layout_marginRight="8dp"
					android:padding="8dp"
					android:background="#00BFA5"
					android:text="Reset"
					android:textSize="18sp"
					android:textStyle="bold"
					android:textColor="#000000"
					android:layout_weight="1.0"/>

			</LinearLayout>

		</LinearLayout>

	</ScrollView>

</RelativeLayout>

Step 5: Open app -> java -> package and open MainActivity.java. Add following code in it.

package package com.myexample.appcompat.gestation;

import android.app.*;
import android.os.*;
import android.view.*;
import android.view.View.*;
import android.support.v7.app.AppCompatActivity;
import android.widget.*;
import java.util.Calendar;
import java.text.SimpleDateFormat;

public class MainActivity extends AppCompatActivity {
	// Declare all EditText, ImageView and Buttons
	private ImageView imageview1;
	private EditText edittext1;
	private EditText edittext2;
	private EditText edittext3;
	private EditText edittext4;
	private Button button2;
	
	@Override
	protected void onCreate(Bundle _savedInstanceState) {
		super.onCreate(_savedInstanceState);
		setContentView(R.layout.main);
		initialize();
	}
	
	private void initialize() {	
		edittext1 = (EditText) findViewById(R.id.edittext1);
		imageview1 = (ImageView) findViewById(R.id.imageview1);
		edittext2 = (EditText) findViewById(R.id.edittext2);
		edittext3 = (EditText) findViewById(R.id.edittext3);
		edittext4 = (EditText) findViewById(R.id.edittext4);
		button2 = (Button) findViewById(R.id.button2);
		
		// Show DatePickerDialog when imageview1 is clicked.
		imageview1.setOnClickListener(new View.OnClickListener() {
				@Override
				public void onClick(View view) {
					showDatePickerDialog(imageview1);
				}
			});
			
		// Empty all EditText when Reset button is clicked.
		button2.setOnClickListener(new View.OnClickListener() {
				@Override
				public void onClick(View view) {
					edittext1.setText("");
					edittext2.setText("");
					edittext3.setText("");
					edittext4.setText("");
				}
			});

	}
	
	// Define showDatePickerDialog(View).
	public void showDatePickerDialog(View v) {
		// Create and show a new DatePickerFragment.
		DialogFragment newFragment = new DatePickerFragment();
		newFragment.show(getFragmentManager(), "datePicker");
	}

	// Define a DialogFragment class DatePickerFragment.
	public static class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {
		// Define a new Calendar c
		Calendar c = Calendar.getInstance();
		@Override
		public Dialog onCreateDialog(Bundle savedInstanceState) {
			// Create DatePickerFragment (a DialogFragment) with a new DatePickerDialog,
			// Present day of month, month, and year are set as the day, month, and year of this DatePickerDialog.
			int y = c.get(Calendar.YEAR);
			int m = c.get(Calendar.MONTH);
			int d = c.get(Calendar.DAY_OF_MONTH);
			return new DatePickerDialog(getActivity(), this, y, m, d);
		}
		public void onDateSet(DatePicker view, int year, int month, int day) {
			int mon = month +1;
			// Define a new Calendar cal
			Calendar cal = Calendar.getInstance();		
			String date = day + "/" + mon + "/" + year;
			// Define the 4 EditText again using the IDs of EditText in main.xml.
			EditText edittext21 = getActivity().findViewById(R.id.edittext1);
			EditText edittext22 = getActivity().findViewById(R.id.edittext2);
			EditText edittext23 = getActivity().findViewById(R.id.edittext3);
			EditText edittext24 = getActivity().findViewById(R.id.edittext4);
			edittext21.setText(date);
			// Set the selected year, month, and day as the year, month, and day of Calendar cal.
			cal.set(Calendar.YEAR, year);
			cal.set(Calendar.MONTH, month);
			cal.set(Calendar.DAY_OF_MONTH, day);
			// find difference between present date (Calendar c) and selected date (Calendar cal) in milliseconds.
			double diff = (long)(c.getTimeInMillis() - cal.getTimeInMillis());
			// If difference is less than 0, show message that selected date is in future.
			if (diff < 0) {
				Toast.makeText(getContext(), "Selected date is in future.", Toast.LENGTH_SHORT).show();
				edittext22.setText("");
				edittext23.setText("");
				edittext24.setText("");
			}
			else {
				// Find complete weeks in Gestational age by dividing the difference with milliseconds in a week.
				int weeks = 1000 * (60 * (60 * 24));
				edittext22.setText(String.valueOf((long)(Math.floor(diff / (weeks * 7)))));
				// Find the remainder of days after removing complete weeks in Gestational age, using modulus operator.
				edittext23.setText(String.valueOf((long)((diff / weeks) % 7)));
				// Add 40 weeks to selected date to get Expected Date of Delivery.
				cal.add(Calendar.HOUR, (int)(40 * (7 * 24)));
				edittext24.setText(new SimpleDateFormat("dd MMM yyyy").format(cal.getTime()));
			}
		}

	}
		
}

Output:
Now run the app. If you click on the ImageView it will display the DatePickerDialog from which a date can be selected. On selecting the date (LMP), it calculates and displays the present Gestational Age in weeks and the Expected Date of Delivery (EDD).