I am using a single button to do two task.
1.Date Selection 2.Difference between two dates
As-is:
I am using 'onclick' method for two button.
To-be:
One button for selecting the date and calculate the difference between two dates.And it should be in sequence.ex: 1: Select date 2. Calculate the difference between dates
Current code: MainActivity.java
package com.bar.example.myapplication;
import android.app.DialogFragment;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.format.DateFormat;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import org.threeten.bp.LocalDate;
import org.threeten.bp.format.DateTimeFormatter;
import org.threeten.bp.format.DateTimeParseException;
import org.threeten.bp.temporal.ChronoUnit;
import java.text.SimpleDateFormat;
public class MainActivity extends AppCompatActivity {
public TextView txtResult, tv, textDivNumber, textAVG, txtZaMisiac;
public static TextView tvresult;
public Button reset, button, button1, button2, button9, editTextDate3, editTextDate5, btnok;
public EditText barcodeResult;
public static EditText courseTitleEditText;
private ListView offeringsListView;
private static DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("d.M.uuuu");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editTextDate5 = (Button) findViewById(R.id.editText5);
button2 = (Button) findViewById(R.id.btnDate2);
txtResult = (TextView) findViewById(R.id.editText2);
editTextDate5.setText(DateFormat.format("dd.MM.yyyy", new java.util.Date()).toString());
}
public void diff(View view) {
SimpleDateFormat myFormat = new SimpleDateFormat("dd.MM.yyyy");
CharSequence inputString1 = editTextDate5.getText();
try {
LocalDate date1 = LocalDate.parse(inputString1, dateFormatter);
CharSequence inputString2 = button2.getText();
try {
LocalDate date2 = LocalDate.parse(inputString2, dateFormatter);
long diffDate = ChronoUnit.DAYS.between(date1, date2);
txtResult.setText(String.valueOf(diffDate));
} catch (DateTimeParseException dtpe) {
Toast.makeText(this, "Date2 is not a valid date: " + inputString2, Toast.LENGTH_SHORT).show();
}
} catch (DateTimeParseException dtpe) {
Toast.makeText(this, "Date1 is not a valid date: " + inputString1, Toast.LENGTH_SHORT).show();
}
}
public void setDate1(View view) {
DialogFragment newFragment = new DatePickerFragment();
newFragment.show(getFragmentManager(), "Date Picker");
}
public void setDate2(View view) {
DialogFragment newFragment = new DatePickerFragment2();
newFragment.show(getFragmentManager(), "Date Picker");
}
@Override
public void onPointerCaptureChanged(boolean hasCapture) {
}
}
Datepickerformat2.java
package com.bar.example.myapplication;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.os.Bundle;
import android.widget.Button;
import android.widget.DatePicker;
import java.util.Calendar;
public class DatePickerFragment2 extends DialogFragment implements DatePickerDialog.OnDateSetListener {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
return new DatePickerDialog(getActivity(), this, year, month, day);
}
public void onDateSet(DatePicker view, int year, int month, int day) {
Button btnDate2 = (Button) getActivity().findViewById(R.id.btnDate2);
String stringOfDate = day + "." + (month + 1) + "." + year;
btnDate2.setText(stringOfDate);
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical">
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:weightSum="1">
<TextView android:id="@+id/editText1" android:layout_width="47dp" android:layout_height="wrap_content" android:ems="10" android:inputType="textNoSuggestions" android:text="Date:" />
<Button android:id="@+id/editText5" android:layout_width="47dp" android:layout_height="wrap_content" android:layout_weight="0.50" android:ems="10" android:inputType="textNoSuggestions" android:text="" />
<TextView android:id="@+id/editText2" android:layout_width="49dp" android:layout_height="wrap_content" android:ems="10" android:inputType="textNoSuggestions" android:text="Expiry:" />
<Button android:id="@+id/btnDate2" android:layout_width="59dp" android:layout_height="wrap_content" android:layout_weight="0.41" android:ems="10" android:onClick="setDate2" android:text="" />
<Button android:id="@+id/button9" android:layout_width="59dp" android:layout_height="wrap_content" android:layout_weight="0.41" android:ems="10" android:inputType="textNoSuggestions" android:onClick="diff" android:text="calc" />
</LinearLayout>
with amended code.
Now again i should click the calc button to know the days difference.
What i need is 1st click the date and select "ok" upon choosing the date.i should be able to see the days difference upon clicking "ok" as per screen instead of pressing again the button.
Requirement 3:
When edittext2 number is exceeds vs spinner2 number then edittext2 color should change it to red color and some doast message
When edittext2 number is reaching to very near vs spinner2 number then edittext2 color should change it to yellow color and some doast message
1.Add below method into MainActivity.java:
public void dualFunctions(View view) {
if(view.getTag() == null) view.setTag("0");
if(view.getTag().equals("0")){
view.setTag("1");
view.setBackgroundColor(Color.GREEN);
setDate2(view);
}else{
view.setTag("0"); // Remove this line for one shoot.
view.setBackgroundColor(Color.YELLOW);
diff(view);
}
}
2.Change the button in layout to use this method.
The method toggles between date selection and calculation. If date selection is allowed for only once, then remove the line with comment.
Hope that helps!
Updated:
public void onDateSet(DatePicker view, int year, int month, int day) {
Button btnDate2 = (Button) getActivity().findViewById(R.id.btnDate2);
String stringOfDate = day + "." + (month + 1) + "." + year;
btnDate2.setText(stringOfDate);
MainActivity activity = (MainActivity)getActivity();
activity.diff(btnDate2);
}
For Requirement3:
Added if-else to check conditions.
private final static int VERY_NEAR_DATE = 30;
public void diff(View view) {
SimpleDateFormat myFormat = new SimpleDateFormat("dd.MM.yyyy");
CharSequence inputString1 = editTextDate5.getText();
try {
LocalDate date1 = LocalDate.parse(inputString1, dateFormatter);
CharSequence inputString2 = button2.getText();
try {
LocalDate date2 = LocalDate.parse(inputString2, dateFormatter);
long diffDate = ChronoUnit.DAYS.between(date1, date2);
txtResult.setText(String.valueOf(diffDate));
diffDate = (Long)ok2.getSelectedItem() - diffDate;
if(diffDate < 0){
txtResult.setTextColor(Color.RED);
Toast.makeText(this, "Date not allowed!!", Toast.LENGTH_SHORT).show();
}else if(diffDate < VERY_NEAR_DATE) {
txtResult.setTextColor(Color.YELLOW);
Toast.makeText(this, "Date too near!", Toast.LENGTH_SHORT).show();
}
} catch (DateTimeParseException dtpe) {
Toast.makeText(this, "Date2 is not a valid date: " + inputString2, Toast.LENGTH_SHORT).show();
}
} catch (DateTimeParseException dtpe) {
Toast.makeText(this, "Date1 is not a valid date: " + inputString1, Toast.LENGTH_SHORT).show();
}
}
If need to update views after selection changed in spinner, then add below code inside onCreate():
ok2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
diff(null);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {}
});