Однокнопочное несколько действий в последовательности - PullRequest
0 голосов
/ 27 мая 2018

Я использую одну кнопку для выполнения двух задач.

1. Выбор даты 2. Разница между двумя датами

Как есть:

Я использую метод «onclick» для двух кнопок.

  1. btnDate2 используется для выбора даты и щелчка по значению (setDate2)
  2. button9 используется для вычисления разницы между двумя датами и щелчка по значению (разность)

Будут:

Одна кнопка для выбора даты и расчета разницы между двумя датами. И она должна быть в последовательности. Пример: 1: Выбрать дату 2. Вычислить разницу между датами

Текущий код: 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>

с измененным кодом.

С 1-м щелчком, enter image description here

После выбора ок.enter image description here

Теперь снова я должен нажать кнопку калькулятора, чтобы узнать разницу в днях.enter image description here

Мне нужно 1-й щелкнуть дату и выбрать «ОК» после выбора даты. Я должен видеть разницу в днях после нажатия «ОК» на экраневместо повторного нажатия кнопки.

Требование 3:

Когда число edittext2 превышает число против spinner2, тогда цвет edittext2 должен изменить его на красный цвет и некоторое сообщение enter image description here

Когда число edittext2 приближается к числу, близкому к значению spinner2, тогда цвет edittext2 должен изменить его на желтый, а также некоторое сообщение enter image description here

1 Ответ

0 голосов
/ 29 мая 2018

1.Добавьте метод ниже в 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. Измените кнопку в макете, чтобы использовать этот метод.

Метод переключается между выбором даты и расчетом.Если выбор даты разрешен только один раз, удалите строку с комментарием.

Надеюсь, что это поможет!

Обновлено:

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

Для требования 3:

Добавлено условие if-else для проверки условий.

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();
    }
}

Если необходимо обновить представления после изменения выбора в счетчике, то добавьте приведенный ниже код внутри 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) {}
    });
...