【问题标题】:How to show Selected Date in EditText using DialogFragment如何使用 DialogFragment 在 EditText 中显示选定的日期
【发布时间】:2015-04-22 05:32:22
【问题描述】:

当用户点击EditText时,我使用DialogFragment显示DatePicker

如何在同一EditText 中显示所选日期。

我使用this 作为参考。

DatePickerFragment.java:

public class DatePickerFragment extends DialogFragment
        implements DatePickerDialog.OnDateSetListener {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the current date as the default date in the picker
        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);

        // Create a new instance of DatePickerDialog and return it
        return new DatePickerDialog(getActivity(), this, year, month, day);
    }

    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
        Calendar c = Calendar.getInstance();
        c.set(year, monthOfYear, dayOfMonth);

        SimpleDateFormat sdf = new SimpleDateFormat("dd MMMM yyyy");
        String formattedDate = sdf.format(c.getTime());
        Toast.makeText(getActivity(), formattedDate, Toast.LENGTH_LONG).show();
    }

}

片段:

editDate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                android.support.v4.app.DialogFragment dialogFragment = new DatePickerFragment();
                dialogFragment.show(getFragmentManager(), "datePicker");
            }
        });

当我点击 EditText 时,它会在 Toast 中显示DatePicker 和选定的日期。但我不知道如何在EditText 中显示该日期?

【问题讨论】:

  • 你实际面临什么问题?
  • 我不知道如何在 EditText 中显示选定的日期 ..

标签: android datepicker android-edittext android-dialogfragment


【解决方案1】:

根据您的班级结构,最好的方法是 创建一个以 EditText 作为参数的构造函数。

private EditText mEditText;
...
public DatePickerFragment(EditText editText)
{
  mEditText = editText;
}

 @Override
 public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) 
{
  Calendar c = Calendar.getInstance();
  c.set(year, monthOfYear, dayOfMonth);

  SimpleDateFormat sdf = new SimpleDateFormat("dd MMMM yyyy");
  String formattedDate = sdf.format(c.getTime());
  Toast.makeText(getActivity(), formattedDate, Toast.LENGTH_LONG).show();

  mEditText.setText( formattedDate );
}

然后在创建对话框选择器类的实例时传递 editDate。

public void onClick(View v) 
{
  android.support.v4.app.DialogFragment dialogFragment = new DatePickerFragment(editDate);
dialogFragment.show(getFragmentManager(), "datePicker");
}

另一种解决方案是删除 DatePickerDialog.OnDateSetListenerDatePickerFragment 并在你的片段中实现监听器。

public class OtherFragment extends Fragment
        implements DatePickerDialog.OnDateSetListener 
{
   @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
        Calendar c = Calendar.getInstance();
        c.set(year, monthOfYear, dayOfMonth);

        SimpleDateFormat sdf = new SimpleDateFormat("dd MMMM yyyy");
        String formattedDate = sdf.format(c.getTime());
        Toast.makeText(getActivity(), formattedDate, Toast.LENGTH_LONG).show();
        editDate.setText( formattedDate );
    }
}

【讨论】:

  • 较新版本的 Android SDK 强制您获取一个空的、无参数的构造函数。检查这个问题:stackoverflow.com/questions/29762949/…
  • 我以前运行过这个问题。这真的只是一个警告。如果你想删除它,那么只需添加另一个没有参数的构造函数并调用 super();在构造函数内部。
  • 这只是一种保护,以防万一您将在 XML 布局中使用该类,当 XML 膨胀时,他们将使用默认构造函数创建对象的实例。只要我们知道自己在做什么,我们就可以为我们的类创建不同的构造函数。
  • 但每当我在 Android Studio 中生成 apk 时都会出现此错误
  • 我已经发布了 XML,现在查看
【解决方案2】:

你可以这样做 -

EditText edttxt_date = (EditText) findViewById(R.id.date);
edttxt_date.setText(formattedDate);
Toast.makeText(getBaseContext(), formattedDate, Toast.LENGTH_SHORT).show();

或 您也可以使用 CalenderDatePickerDialogFragment 来显示类似这样的时间并将相应的值返回给您的片段。

DateFormat dateFormat = DateFormat.getDateInstance();
edttxt_date.setText(dateFormat.format(cal.getTime()));

希望对你有帮助!!

【讨论】:

    【解决方案3】:

    只需替换这个:

    Toast.makeText(getActivity(), formattedDate, Toast.LENGTH_LONG).show(); 
    

    行或输入此行以在您的 EditText 中显示日期:

    EditText date=(EditText)find(...);
    date.setText(formattedDate);
    

    【讨论】:

    • 但我在 Fragment 中使用 EditText,而 formattedDate 在 DatePickerFragment.java 中
    【解决方案4】:

    在 MainFragment 类中添加 DatePickerFragment 类。 一旦调用 public void onDateSet() 调用同一类中的方法来更新 editText 字段。

    public MainFragment extents Fragment{
    
            .....
             updateDateField(String formattedDate){
                  editDate.setText(formattedDate);
             }
    
            public class DatePickerFragment extends DialogFragment
                       implements DatePickerDialog.OnDateSetListener {
    ....
               @Override
              public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                     Calendar c = Calendar.getInstance();
                     c.set(year, monthOfYear, dayOfMonth);
    
                     SimpleDateFormat sdf = new SimpleDateFormat("dd MMMM yyyy");
                                    String formattedDate = sdf.format(c.getTime());
                                    updateDateField(formattedDate);
                }
            }
        }
    

    【讨论】:

    • 我试过你的方法,但是得到:错误:(121)错误:这个片段内部类应该是静态的(MainFragment.DatePickerFragment)[ValidFragment]
    • 尝试将 DatePickerFragment 设为静态
    • 否则尝试使用回调监听器。将 DatePickerFragment 写为新类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    相关资源
    最近更新 更多