如何从第一个DatePicker中选择后禁用日期

问题描述 投票:0回答:2

我有两个Dialog Picker:Check in and Check Out。但是我希望在点击Check In中的日期后,它会在此之前禁用日期。因此,当我在Checkout上点击2019年3月6日时,它应该是2019年3月7日,依此类推。

签入和签出图像

date picker fragment.Java:

public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {


        Calendar c = Calendar.getInstance();
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int day = c.get(Calendar.DAY_OF_MONTH);

        DatePickerDialog dialog = new DatePickerDialog(getContext(), (DatePickerDialog.OnDateSetListener)getActivity(), year, month, day);

        dialog.getDatePicker().setMinDate(System.currentTimeMillis()-1000);


        return dialog;
    }

details.Java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_details);

     final DialogFragment datePicker = new DatePickerFragment();

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            datePicker.show(getSupportFragmentManager(),"Date Picker");
            startDateOrEndDate = true ;
        }
    });
    button1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            datePicker.show(getSupportFragmentManager(),"Date Picker");
            startDateOrEndDate = false ;
        }
    });
      }

public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
    Calendar c = Calendar.getInstance();
    c.set(Calendar.YEAR, year );
    c.set(Calendar.MONTH, month);
    c.set(Calendar.DAY_OF_MONTH, dayOfMonth);
    String date = DateFormat.getDateInstance(DateFormat.FULL).format(c.getTime());



    TextView textView = (TextView) findViewById(R.id.checkInTV);
    TextView textView2 = (TextView) findViewById(R.id.checkOutTV);




    if (startDateOrEndDate) {
        textView.setText(date);
    } else {
        textView2.setText(date);
    }
}
android android-datepicker
2个回答
0
投票

您可以复制粘贴以下代码,然后添加您的代码。

MainActivity

public class MainActivity extends AppCompatActivity implements
    DatePickerDialog.OnDateSetListener{
final long[]l = new long[1];
boolean startDateOrEndDate;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button en = findViewById(R.id.entry);
    Button ex = findViewById(R.id.exit);


    final myDatepickerFragment datePicker = new myDatepickerFragment();

    en.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            l[0]= System.currentTimeMillis();
            datePicker.show(getSupportFragmentManager(),l[0]+"");

            startDateOrEndDate = true ;
        }
    });
    ex.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            datePicker.show(getSupportFragmentManager(),l[0]+"");
            startDateOrEndDate = false ;
        }
    });

}
@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
    Calendar c = Calendar.getInstance();
    c.set(Calendar.YEAR, year);
    c.set(Calendar.MONTH, month);
    c.set(Calendar.DAY_OF_MONTH, dayOfMonth);
    l[0]= c.getTimeInMillis()+24*60*60*1000;
    String date = DateFormat.getDateInstance(DateFormat.FULL).format(c.getTime());
    System.out.println(date);

TextView textView = (TextView) findViewById(R.id.checkInTV);
TextView textView2 = (TextView) findViewById(R.id.checkOutTV);


if (startDateOrEndDate) {
    textView.setText(date);
} else {
    textView2.setText(date);
}
}
}

Fragment类

public class myDatepickerFragment extends DialogFragment {
private String tag;

@Override
public void show(FragmentManager manager, String tag) {
    super.show(manager, tag);
    this.tag = tag;
}

@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {


    Calendar c = Calendar.getInstance();
    int year = c.get(Calendar.YEAR);
    int month = c.get(Calendar.MONTH);
    int day = c.get(Calendar.DAY_OF_MONTH);
    long l = Long.parseLong(tag);
    DatePickerDialog dialog = new DatePickerDialog(getContext(), (DatePickerDialog.OnDateSetListener)getActivity(), year, month, day);

    dialog.getDatePicker().setMinDate(l-1000);
    dialog.getDatePicker().setBackgroundColor(Color.rgb(50,100,100));


    return dialog;
} }

我之前开始尝试使用“tag”属性;可能没有正确的字帖风格,但它符合我的目的。

顺便说一下,你似乎在(主)活动中实现了监听器,但我没有看到“@override”。你能解释一下吗?


0
投票

我相信您正在寻找的是重新设计日期选择器代码,以便在创建时可以设置setMinDate(),以便您可以传递最小日期。现在你正在设置最小日期:

dialog.getDatePicker().setMinDate(System.currentTimeMillis() - 1000);

这适用于第一个日期选择器,因为今天给出的最小日期是,但是对于第二个日期选择器,您希望在第一个日期作为最小日期传递。

在创建日期选择器片段方面,我不知道您的其他代码是什么样的,但假设您正在使用片段,则可以在创建片段时将最小日期放在参数包中。以下是在创建片段时如何传递最小日期的示例:

// This would be the start date the user had previously chosen
long startDate = 0L

Bundle bundle = new Bundle(); 

// We only want to put in the min date if this is the second date
if (!startDateOrEndDate) {
    bundle.putLong("minDate", startDate); 
}

// Create the Fragment, set the bundle as its arguments
DatePickerFragment fragment = new DatePickerFragment(); 
fragment.setArguments(bundle);

然后,在DatePickerFragment中,您将相应地设置最小日期:

public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
    // Dialog Creation code here

    // Default the min date to today 
    long minDate = System.currentTimeMillis() - 1000;

    // Check if there are arguments
    Bundle args = getArguments(); 
    if (args != null) {
        // If there are args, grab the min date from it (default to today just in case)
        minDate = args.getLong("minDate", minDate); 
    }

    dialog.getDatePicker().setMinDate(minDate); 

    return dialog; 
}

有几点需要考虑:

  • 您必须确保用户在结束日期之前选择开始日期。
  • 您可能希望将结束日期设置为(startDate + 1 day)而不是startDate,因此在传递minDate时需要考虑到这一点。

总的来说,这应该让您了解如何继续。

旁注:我建议将布尔值重命名为明文,例如isStartDate。这样,如果它是真的,你知道它是开始日期,反之亦然。 startDateOrEndDate没有告诉我们它是哪一个,如果它是真的,它只是告诉我们它是开始日期还是结束日期。

编辑 - 2019年3月11日

鉴于您的新代码,您可以使用我上面所述的方式更改它

details.Java

private long startDate = -1L; 

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_details);

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            DialogFragment datePicker = new DatePickerFragment();
            datePicker.show(getSupportFragmentManager(),"Date Picker");
            startDateOrEndDate = true ;
        }
    });
    button1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (startDate == -1L) {
                // Start date hasn't been chosen yet, tell user to do so
                Toast.makeText(Details.this, "Please choose start date", Toast.LENGTH_SHORT).show(); 
                return; 
            }

            // Add the start date to the bundle
            Bundle bundle = new Bundle(); 
            bundle.putLong("minDate", startDate); 

            // Create the Fragment, set the bundle as its arguments
            DatePickerFragment datePicker = new DatePickerFragment(); 
            datePicker.setArguments(bundle);
            datePicker.show(getSupportFragmentManager(),"Date Picker");
            startDateOrEndDate = false ;
        }
    });
}

public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
    Calendar c = Calendar.getInstance();
    c.set(Calendar.YEAR, year );
    c.set(Calendar.MONTH, month);
    c.set(Calendar.DAY_OF_MONTH, dayOfMonth);
    String date = DateFormat.getDateInstance(DateFormat.FULL).format(c.getTime());

    TextView textView = (TextView) findViewById(R.id.checkInTV);
    TextView textView2 = (TextView) findViewById(R.id.checkOutTV);

    if (startDateOrEndDate) {
        // If this is the start date, save it to the instance variable above
        startDate = c.getTimeinMillis(); 
        textView.setText(date);
    } else {
        textView2.setText(date);
    }
}

onCreateDialog()DatePickerFragment中使用上面原始答案中的代码。

如果这有意义,请告诉我!

© www.soinside.com 2019 - 2024. All rights reserved.