Android 使用dialogfragment从日期选择器获取日期
我正在使用google示例,使用dialogfragment在我的应用程序中插入一个日期选择器Android 使用dialogfragment从日期选择器获取日期,android,datepicker,android-dialog,android-datepicker,Android,Datepicker,Android Dialog,Android Datepicker,我正在使用google示例,使用dialogfragment在我的应用程序中插入一个日期选择器 但我不确定设置日期后如何获取日期(不是java专家)。对话框和日期选择器运行正常,我可以记录正确设置的日期,但如何才能在父活动上执行回调 这是我的对话片段 public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener { @Overri
但我不确定设置日期后如何获取日期(不是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);
}
public void onDateSet(DatePicker view, int year, int month, int day) {
**Log.w("DatePicker","Date = " + year);**
}
}
…我从我的活动中调用dialog与
public void showDatePickerDialog(View v) {
DialogFragment newFragment = new DatePickerFragment();
newFragment.show(getSupportFragmentManager(), "datePicker");
}
在我的父活动中调用方法而不是Log.w的正确方法是什么?我想这与作为参数传递回调有关,但我在internet上找到的大多数引用都是关于以前没有对话框片段的版本
编辑:不确定是否重要,但父活动声明为:
public class EditSessionActivity extends FragmentActivity {
解决方案:多亏了Lecho用户,这才是解决问题的方法
DatePickerFragmentt.class
public class DatePickerFragment extends DialogFragment{
@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(), (EditSessionActivity)getActivity(), year, month, day);
}
}
…和父活动EditSessionActivity.class
public class EditSessionActivity extends FragmentActivity implements OnDateSetListener {
...
@Override
public void onDateSet(DatePicker view, int year, int month, int day) {
//do some stuff for example write on log and update TextField on activity
Log.w("DatePicker","Date = " + year);
((EditText) findViewById(R.id.tf_date)).setText("Date = " + year);
}
DatePickerDialog的构造函数将DatePickerDialog.OnDateSetListener作为第二个参数,因此您可能应该在父活动
EditSessionActivity
(不在DatePickerFragment
中)中实现该接口,并更改此行:
return new DatePickerDialog(getActivity(), this, year, month, day);
为此:
return new DatePickerDialog(getActivity(), (EditSessionActivity)getActivity(), year, month, day);
然后您的活动应该如下所示:
public class EditSessionActivity extends FragmentActivity implements
DatePickerDialog.OnDateSetListener{
public void onDateSet(DatePicker view, int year, int month, int day) {
//use date in your activity
}
...
}
我在显示日期选择器的类中的日期选择器创建中简单重写onDateSet。 见下面的代码:
private OnClickListener onDateClicked() {
return new OnClickListener() {
@Override
public void onClick(View v) {
DialogFragment newFragment = new DatePickerFragment() {
@Override
public void onDateSet(DatePicker view, int year, int month, int day) {
salePaymentCustomView.setBtDateText("" + day + "/" + month+1 + "/" + year);
}
};
newFragment.show(getActivity().getSupportFragmentManager(), "datePicker");
}
};
}
也可以在不将
onDateSet
方法移动到父活动的情况下解决此问题。您只需告诉DatePickerFragment
在何处搜索视图:
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);
}
public void onDateSet(DatePicker view, int year, int month, int day) {
// do some stuff for example write on log and update TextField on activity
Log.w("DatePicker","Date = " + year);
((TextView) getActivity().findViewById(R.id.tf_date)).setText("Date = " + year);
}
}
我还将演员阵容的目标从
EditText
更改为TextView
。通过这种方式,您可以对不同类型的视图重用您的实现,而不仅仅是对EditText
我对上述答案有一个更正。
public void onDate(View view) {
DialogFragment fragment = new SelectDateFragment();
fragment.show(getFragmentManager(), "Date Picker");
}
// @SuppressLint("NewApi")
class SelectDateFragment extends DialogFragment implements
DatePickerDialog.OnDateSetListener {
public Dialog onCreateDialog(Bundle savedInstanceState) {
System.out.println("entrering on create dialog");;
return new DatePickerDialog(getActivity(), this, mYear, mMonth,
mDay);//it will return dialog setting date with mYera,MMonth and MDay
}
@Override
public void onDateSet(android.widget.DatePicker view, int year,
int monthOfYear, int dayOfMonth) {
System.out.println("year=" + year + "day=" + dayOfMonth + "month="
+ monthOfYear);
mYear=year;
mMonth=monthOfYear;
mDay=dayOfMonth;
onPopulateSet(year, monthOfYear + 1, dayOfMonth);
}
// set the selected date in the edit text
private void onPopulateSet(int year, int i, int dayOfMonth) {
EditText et_setDate;
et_setDate = (EditText) findViewById(R.id.register_et_dob);//register_et_dob:-id name of the edit text
et_setDate.setText(dayOfMonth + "/" + i + "/" + year);
System.out.println("enetring on populate Set");
}
而不是像这样返回DatePickerDialog
返回新的DatePickerDialog(getActivity(),(EditSessionActivity)getActivity(),年、月、日)
您应该以更通用的方式返回它
返回新的DatePickerDialog(getActivity(),(OnDateSetListener)getActivity(),年、月、日)
只需确保您的活动实现OnDateSetListener接口并重写onDateSet函数
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear,int dayOfMonth)
我也有类似的问题,但我的日期选择器是从另一个片段中的一个对话框片段启动的。这使得处理回调非常困难,因为它们希望返回到主活动,我希望数据返回到上一个对话框片段 最初,我将新的日期值传递给主活动(使用OnDateSetListener),并打算使用启动日期选择器的对话框获取它们,但当日期选择器关闭时,该对话框中没有触发生命周期事件 我得到的结果是在日期选择器中的onDismiss中,实例化一个新的对话框片段,对其调用set results方法,然后启动它。当然,对于这一点,您需要确保前一个片段在启动日期选择器时被忽略 这是调用日期选择器的dialogFragment
public class NewTrialDialogFragment extends DialogFragment {
public final String LOG_TAG = "NewTrialDialog Fragment";
Button startDateButton;
Integer newYear, newMonth, newDay;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.dialog_new_trial, container, false);
getDialog().setTitle("Dialog New Trial");
startDateButton = (Button) rootView.findViewById(R.id.button_start_date);
startDateButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showDatePickerDialog(v);
}
});
//If you exit the datepicker without choosing anything, it returns zeros
if (newYear != null && newMonth != null && newDay != null && newYear != 0) {
startDateButton.setText(newYear + " " + newMonth + " " + newDay);
}else{
startDateButton.setText("Select Start Date");
}
return rootView;
}
public void showDatePickerDialog(View v) {
TrialDatePickerDialog newDialog = new TrialDatePickerDialog();
newDialog.show(getActivity().getSupportFragmentManager(), "datePicker");
this.dismiss();
}
public void setDates(int year, int month, int day){
newYear = year;
newMonth = month;
newDay = day;
}}
public class TrialDatePickerDialog extends DialogFragment implements DatePickerDialog.OnDateSetListener
{
private final String LOG_TAG = "TrialDatePickerDialog";
int newYear, newMonth, newDay;
@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 TrialDatePickerDialog and return it
return new DatePickerDialog(getActivity(), this , year, month, day);
}
@Override
public void onDismiss(DialogInterface dialog) {
super.onDismiss(dialog);
FragmentManager fm = getActivity().getSupportFragmentManager();
NewTrialDialogFragment newTrialDialogFragment = new NewTrialDialogFragment();
newTrialDialogFragment.setDates(newYear, newMonth, newDay);
newTrialDialogFragment.show(fm, "new_trial_dialog");
}
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
newYear = year;
newMonth = monthOfYear;
newDay = dayOfMonth;
}
}
还有日期选择器
public class NewTrialDialogFragment extends DialogFragment {
public final String LOG_TAG = "NewTrialDialog Fragment";
Button startDateButton;
Integer newYear, newMonth, newDay;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.dialog_new_trial, container, false);
getDialog().setTitle("Dialog New Trial");
startDateButton = (Button) rootView.findViewById(R.id.button_start_date);
startDateButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showDatePickerDialog(v);
}
});
//If you exit the datepicker without choosing anything, it returns zeros
if (newYear != null && newMonth != null && newDay != null && newYear != 0) {
startDateButton.setText(newYear + " " + newMonth + " " + newDay);
}else{
startDateButton.setText("Select Start Date");
}
return rootView;
}
public void showDatePickerDialog(View v) {
TrialDatePickerDialog newDialog = new TrialDatePickerDialog();
newDialog.show(getActivity().getSupportFragmentManager(), "datePicker");
this.dismiss();
}
public void setDates(int year, int month, int day){
newYear = year;
newMonth = month;
newDay = day;
}}
public class TrialDatePickerDialog extends DialogFragment implements DatePickerDialog.OnDateSetListener
{
private final String LOG_TAG = "TrialDatePickerDialog";
int newYear, newMonth, newDay;
@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 TrialDatePickerDialog and return it
return new DatePickerDialog(getActivity(), this , year, month, day);
}
@Override
public void onDismiss(DialogInterface dialog) {
super.onDismiss(dialog);
FragmentManager fm = getActivity().getSupportFragmentManager();
NewTrialDialogFragment newTrialDialogFragment = new NewTrialDialogFragment();
newTrialDialogFragment.setDates(newYear, newMonth, newDay);
newTrialDialogFragment.show(fm, "new_trial_dialog");
}
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
newYear = year;
newMonth = monthOfYear;
newDay = dayOfMonth;
}
}
Leszek的答案是有效的,但如果对话是从另一个片段开始的,则答案是无效的。在这种情况下,需要在创建对话框的代码中使用
setTargetFragment()
,在对话框代码中使用getTargetFragment()
在创建对话框的代码中:
DialogFragment dialogFragment = new YourDialogFragment();
dialogFragment.setTargetFragment(YourParentFragment.this, 0);
dialogFragment.show(getFragmentManager(), "mydialog");
在对话框片段代码中:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
DatePickerDialog.OnDateSetListener listener = new DatePickerDialog.OnDateSetListener()
{
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth)
{
YourParentFragment parentFragment = (YourParentFragment) getTargetFragment();
// Manipulate the parent fragment
// ...
}
};
// Get the initial date
// ...
return new DatePickerDialog(getActivity(), listener, year, month, day);
}
如果您必须将结果返回到片段,而不是活动,下面是一个完整的解决方案:
public class DatePickerDialogFragment extends DialogFragment {
private static final String ARGUMENT_YEAR = "ARGUMENT_YEAR";
private static final String ARGUMENT_MONTH = "ARGUMENT_MONTH";
private static final String ARGUMENT_DAY = "ARGUMENT_DAY";
private DatePickerDialog.OnDateSetListener listener;
private int year;
private int month;
private int dayOfMonth;
public static DatePickerDialogFragment newInstance(final int year, final int month, final int dayOfMonth) {
final DatePickerDialogFragment df = new DatePickerDialogFragment();
final Bundle args = new Bundle();
args.putInt(ARGUMENT_YEAR, year);
args.putInt(ARGUMENT_MONTH, month);
args.putInt(ARGUMENT_DAY, dayOfMonth);
df.setArguments(args);
return df;
}
@Override
public void onCreate(@Nullable final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
retrieveArguments();
}
private void retrieveArguments() {
final Bundle args = getArguments();
if (args != null) {
year = args.getInt(ARGUMENT_YEAR);
month = args.getInt(ARGUMENT_MONTH);
dayOfMonth = args.getInt(ARGUMENT_DAY);
}
}
@Override
public Dialog onCreateDialog(final Bundle savedInstanceState) {
return new DatePickerDialog(getContext(), this.listener, this.year, this.month, this.dayOfMonth);
}
public void setListener(final DatePickerDialog.OnDateSetListener listener) {
this.listener = listener;
}
}
然后在片段或活动中使用它:
final Calendar c = Calendar.getInstance();
DatePickerDialogFragment datePicker = DatePickerDialogFragment.newInstance(
c.get(Calendar.YEAR),
c.get(Calendar.MONTH),
c.get(Calendar.DAY_OF_MONTH));
datePicker.setListener(this);
datePicker.show(getChildFragmentManager(), null);
科特林版本
DatePickerFragment类:
class DatePickerFragment : DialogFragment() {
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val c = Calendar.getInstance()
val year = c.get(Calendar.YEAR)
val month = c.get(Calendar.MONTH)
val day = c.get(Calendar.DAY_OF_MONTH)
return DatePickerDialog(context!!, context!! as MainActivity, year, month, day)
}
}
DatePickerDialog.OnDateSetListener被移动到MainActivity
class MainActivity : AppCompatActivity(), DatePickerDialog.OnDateSetListener {
..
override fun onDateSet(view: DatePicker, year: Int, month: Int, day: Int) {
//use date in your activity
}
}
这是有用的,我将扩展我的问题,包括您的解决方案。我建议大家阅读关于实现接口的内容。我想您不是要强制转换到EditSessionActivity,而是要强制转换到OnDateSetListener。是的,您是对的,它将强制转换到OnDateSetListener,因为EditSessionActivity实现了OnDateSetListener,但您的建议会使代码更加清晰。如果您有两个或更多的日期字段,应该使用DatePickerDialog填充,您会怎么做?在onDateSet()中,可以区分调用DatePickerDialog的是哪个字段吗?在这种情况下,我通常会实现自定义DialogFragment,它带有一些标志,让我以后可以区分显示它的是哪个字段。我还需要自定义侦听器。看看这个要点,例如实现。这是时间选择器,但日期选择器将非常类似。谢谢你,这是一个简单的情况下,多个日期字段的汉克斯,这是最简单的解决方案,我看到了迄今为止!当我尝试时,我得到了这个错误-片段应该是静态的,这样系统就可以重新实例化它们,匿名类也不是很有创造性,但是有一个更简单的方法:查看我的答案。这看起来不错,只是调用片段时我遇到了
.setListener(this)
的问题。我将该代码放入名为bday
的编辑文本的onClickListener
中,我希望在其中使用setText
显示所选日期。你知道我应该如何使用你的解决方案吗?@frank17如果你想在click listener中使用它,并且DatePickerDialog.OnDateSetListener是由一个片段实现的,你应该使用setListener(YourFragment.this)。否则,这指的是clicklistener本身