Search code examples
androidonclickonclicklistenerbuttonclick

Single button multiple action in sequence


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.

  1. btnDate2 using to select the date and onclick is(setDate2)
  2. button9 using to calculate the difference between two dates and onclick is(diff)

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.

With 1st Click , enter image description here

After selecting ok. enter image description here

Now again i should click the calc button to know the days difference. enter image description here

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 enter image description here

When edittext2 number is reaching to very near vs spinner2 number then edittext2 color should change it to yellow color and some doast message enter image description here


Solution

  • 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) {}
        });