【问题标题】:How to disable dates after selecting from the first DatePicker从第一个 DatePicker 选择后如何禁用日期
【发布时间】:2019-03-06 15:00:16
【问题描述】:

我有两个对话框选择器:签入和签出。但我希望在单击“签入”中的日期后,它将禁用之前的日期。因此,当我在 Check In 上单击 2019 年 3 月 6 日时,在 Checkout 上,应该是 2019 年 3 月 7 日,依此类推。

签入和签出图片

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

【问题讨论】:

  • 但我需要的是用户选择了第一个日期,然后在第二个日期,第一个日期之前的日期应该被禁用。例如。现在是 3 月 6 日,所以在第一个日期选择器上我选择了 3 月 9 日,然后在第二个日期选择器上,3 月 9 日之前的日期应该已经被禁用,只有从 3 月 9 日开始应该适用。
  • 您找到解决方案了吗?
  • 很遗憾没有 T_T。我更新了我的代码,但我想没有人没有找到解决方案。请帮忙。谢谢你:)
  • 请标记你评论的人,否则他们永远不会知道你评论了。只需输入@name,(收件人姓名的前几个字母)它会自动填写。

标签: android android-datepicker


【解决方案1】:

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

主活动

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

片段类

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”。请您解释一下。

【讨论】:

  • 如何显示从对话框中选择的日期到文本视图?在 checkIn 和 checkOut 文本视图中都
  • @ChristianDeSilva 使用 onDateSet() 内部的“日期”。不是你早做的吗?
  • 事情就是这样。如果我使用 onDateSet() 内部的“日期”,那么我可能会在 Check In 和 Check Out 文本视图中显示相同的日期?
  • @ChristianDeSilva,不,我想不应该。您已经有一个我没有包含的代码,因为我要求您包含该代码,我修改了答案以包含您的代码。
  • @ChristianDeSilva,你有没有通过不同的按钮点击得到不同的日期。我相信你应该这样做。
【解决方案2】:

我相信您正在寻找的是修改您的日期选择器代码,以便可以在创建时设置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);
    }
}

DatePickerFragmentonCreateDialog() 中使用我上面原始答案中的代码。

让我知道这是否有意义!

【讨论】:

  • 我将如何 setText the bundle.putLong("minDate", startDate);进入文本视图?
  • 我实际上什么也没得到。我是android编程的新手T_T
  • 我收到 java.lang.NullPointerException 错误:尝试在空对象引用上调用虚拟方法 'long android.os.Bundle.getLong(java.lang.String, long)'在 com.example.batangasbeachhousesfinal.DatePickerFragment.onCreateDialog(DatePickerFragment.java:28)
  • 是的,那是因为我没有将参数添加到第一个 DatePicker。这是未经测试的代码,我很抱歉。我马上编辑。您只需要在继续之前检查是否有捆绑包。
  • 实际上不,当我这样做时它崩溃了。但谢谢你顺便说一句:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-05
  • 2019-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多