在 Dialogfragment 中显示 DatePickerDialog
showing a DatePickerDialog inside a Dialogfragment
我创建了一个 DialogFragment
,它有一个 EditText
,当用户按下 EditText
时,有一个新的 DatePickerDialog
,它假设从用户,然后在 DialogFragment
中设置它。我很难做到:
- DatePickerDialog 实际上出现了,但破坏了旧的
DialogFragment
。当我点击 ok/whatever 我 return 到 activity.
- 我想将我选择的日期传回片段。如果我想将它传回 activity 会更容易,因为我可以使用
getActivity()
方法。那么如何将我选择的日期传递回调用选择器的片段?
主要片段
public class NewWorkoutItemFragment extends android.app.DialogFragment implements
View.OnClickListener {
private String mDate;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_new_workout_item, container, false);
//A lot of code
return view;
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.NewWorkout_date_et:
//Call to DatePickerDialog
DialogFragment pickDate = new DatePickerFragment();
pickDate.show(getFragmentManager(), "show");
}
public void setmDate(String mDate) {
this.mDate = mDate;
}
}
DatePickerFragment
public class DatePickerFragment extends android.app.DialogFragment implements DatePickerDialog.OnDateSetListener {
@NonNull
@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 month, int dayOfMonth) {
String dateString = Integer.toString(dayOfMonth) +
"/" + Integer.toString(month+1) +
"/" + Integer.toString(year);
//note- Return dateString back to NewWorkoutItemFragment, using setmDate
}
}
您应该为 datepicker
或 timepicker
对话框使用 'com.wdullaer:materialdatetimepicker:2.3.0'
库。
首先在app level gradle file
中添加依赖。之后用 NewWorkoutItemFragment extends DialogFragment
创建一个新的 java 文件。
public class NewWorkoutItemFragment extends DialogFragment implements
DatePickerDialog.OnDateSetListener {
@OnClick(R.id.layout_time)
public void onClickTime(View view){
calendar= Calendar.getInstance();
datePickerDialog= TimePickerDialog.newInstance(NewWorkoutItemFragment.this,
calendar.get(Calendar.YEAR), // Initial year selection
calendar.get(Calendar.MONTH), // Initial month selection
calendar.get(Calendar.DAY_OF_MONTH) // Inital day selection
false);
datePickerDialog.setThemeDark(false);
datePickerDialog.setAccentColor(Color.parseColor("#58a5f0"));
datePickerDialog.setTitle("Select Date");
datePickerDialog.show(getFragmentManager(),"DatePicker Dialog");
}
public NewWorkoutItemFragment() {
}
public static NewWorkoutItemFragment newInstance (String title) {
NewWorkoutItemFragment frag = new NewWorkoutItemFragment();
Bundle args = new Bundle();
args.putString("title", title);
frag.setArguments(args);
return frag;
}
@Override
public void onAttach(final Context context) {
super.onAttach(context);
}
@Override
public void onDetach() {
super.onDetach();
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final Dialog dialog = super.onCreateDialog(savedInstanceState);
final Window window = dialog.getWindow();
if (window != null) {
window.requestFeature(Window.FEATURE_NO_TITLE);
window.setBackgroundDrawableResource(android.R.color.transparent);
WindowManager.LayoutParams windowLayoutParams = window.getAttributes();
windowLayoutParams.dimAmount = DIM_AMOUNT;
}
dialog.setCancelable(false);
dialog.setCanceledOnTouchOutside(false);
return dialog;
}
@Nullable
@Override
public View onCreateView(final LayoutInflater inflater,
final ViewGroup container,
final Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.dlg_network, container, false);
return view;
}
@Override
public void onResume() {
super.onResume();
final int width = getScreenWidth();
changeWindowSizes(width, ViewGroup.LayoutParams.WRAP_CONTENT);
}
public static int getScreenWidth() {
return Resources.getSystem().getDisplayMetrics().widthPixels;
}
private void changeWindowSizes(int width, int height) {
final Window window = getDialog().getWindow();
if (window != null) {
// hack to change window width
window.setLayout(width, height);
}
}
@Override
public void onDestroyView() {
super.onDestroyView();
mUnbinder.unbind();
}
@Override
public int getTheme() {
return R.style.CustomDialog;
}
@Override
public void onDateSet(DatePickerDialog view, int year, int monthOfYear, int dayOfMonth) {
String date = "You picked the following date: "+dayOfMonth+"/"+(monthOfYear+1)+"/"+year;
dateTextView.setText(date);
}
}
和你想打开的classNewWorkoutItemFragment
只需要让这个对话框的对象class像
newWorkDialog= new NewWorkoutItemFragment();
NewWorkoutItemFragment newWorkDialog;
newWorkDialog= NewWorkoutItemFragment.newInstance("T");
newWorkDialog.show(manager,"Show");
在样式文件中只需添加以下行
<style name="CustomDialog" parent="Theme.AppCompat.Light.Dialog">
<item name="android:windowAnimationStyle">@style/CustomDialogAnimation</item>
</style>
<style name="CustomDialogAnimation">
<item name="android:windowEnterAnimation">@anim/translate_left_side</item>
<item name="android:windowExitAnimation">@anim/translate_right_side</item>
</style>
并在 res
中创建一个新包并将其命名为 anim
并在 anim
文件夹中创建两个文件 transition_left_side
和 transition_right_side
.
transition_left_side
代码
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="600"
android:fromXDelta="100%"
android:toXDelta="0%"/>
和 transition_right_side
的代码
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0%" android:toXDelta="100%"
android:fromYDelta="0%" android:toYDelta="0%"
android:duration="600"/>
我想这不会造成任何进一步的错误。
解决方案根本与 datepickerdialog
无关。我的片段中有一个 switch-case 来管理点击事件。我不小心忘记在导致流向其他事件(其中一个是 dismiss();
)的案例之后放一个 break;
,这就是为什么 datepickerdialog 也忽略了我的片段。
我创建了一个 DialogFragment
,它有一个 EditText
,当用户按下 EditText
时,有一个新的 DatePickerDialog
,它假设从用户,然后在 DialogFragment
中设置它。我很难做到:
- DatePickerDialog 实际上出现了,但破坏了旧的
DialogFragment
。当我点击 ok/whatever 我 return 到 activity. - 我想将我选择的日期传回片段。如果我想将它传回 activity 会更容易,因为我可以使用
getActivity()
方法。那么如何将我选择的日期传递回调用选择器的片段?
主要片段
public class NewWorkoutItemFragment extends android.app.DialogFragment implements
View.OnClickListener {
private String mDate;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_new_workout_item, container, false);
//A lot of code
return view;
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.NewWorkout_date_et:
//Call to DatePickerDialog
DialogFragment pickDate = new DatePickerFragment();
pickDate.show(getFragmentManager(), "show");
}
public void setmDate(String mDate) {
this.mDate = mDate;
}
}
DatePickerFragment
public class DatePickerFragment extends android.app.DialogFragment implements DatePickerDialog.OnDateSetListener {
@NonNull
@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 month, int dayOfMonth) {
String dateString = Integer.toString(dayOfMonth) +
"/" + Integer.toString(month+1) +
"/" + Integer.toString(year);
//note- Return dateString back to NewWorkoutItemFragment, using setmDate
}
}
您应该为 datepicker
或 timepicker
对话框使用 'com.wdullaer:materialdatetimepicker:2.3.0'
库。
首先在app level gradle file
中添加依赖。之后用 NewWorkoutItemFragment extends DialogFragment
创建一个新的 java 文件。
public class NewWorkoutItemFragment extends DialogFragment implements
DatePickerDialog.OnDateSetListener {
@OnClick(R.id.layout_time)
public void onClickTime(View view){
calendar= Calendar.getInstance();
datePickerDialog= TimePickerDialog.newInstance(NewWorkoutItemFragment.this,
calendar.get(Calendar.YEAR), // Initial year selection
calendar.get(Calendar.MONTH), // Initial month selection
calendar.get(Calendar.DAY_OF_MONTH) // Inital day selection
false);
datePickerDialog.setThemeDark(false);
datePickerDialog.setAccentColor(Color.parseColor("#58a5f0"));
datePickerDialog.setTitle("Select Date");
datePickerDialog.show(getFragmentManager(),"DatePicker Dialog");
}
public NewWorkoutItemFragment() {
}
public static NewWorkoutItemFragment newInstance (String title) {
NewWorkoutItemFragment frag = new NewWorkoutItemFragment();
Bundle args = new Bundle();
args.putString("title", title);
frag.setArguments(args);
return frag;
}
@Override
public void onAttach(final Context context) {
super.onAttach(context);
}
@Override
public void onDetach() {
super.onDetach();
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final Dialog dialog = super.onCreateDialog(savedInstanceState);
final Window window = dialog.getWindow();
if (window != null) {
window.requestFeature(Window.FEATURE_NO_TITLE);
window.setBackgroundDrawableResource(android.R.color.transparent);
WindowManager.LayoutParams windowLayoutParams = window.getAttributes();
windowLayoutParams.dimAmount = DIM_AMOUNT;
}
dialog.setCancelable(false);
dialog.setCanceledOnTouchOutside(false);
return dialog;
}
@Nullable
@Override
public View onCreateView(final LayoutInflater inflater,
final ViewGroup container,
final Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.dlg_network, container, false);
return view;
}
@Override
public void onResume() {
super.onResume();
final int width = getScreenWidth();
changeWindowSizes(width, ViewGroup.LayoutParams.WRAP_CONTENT);
}
public static int getScreenWidth() {
return Resources.getSystem().getDisplayMetrics().widthPixels;
}
private void changeWindowSizes(int width, int height) {
final Window window = getDialog().getWindow();
if (window != null) {
// hack to change window width
window.setLayout(width, height);
}
}
@Override
public void onDestroyView() {
super.onDestroyView();
mUnbinder.unbind();
}
@Override
public int getTheme() {
return R.style.CustomDialog;
}
@Override
public void onDateSet(DatePickerDialog view, int year, int monthOfYear, int dayOfMonth) {
String date = "You picked the following date: "+dayOfMonth+"/"+(monthOfYear+1)+"/"+year;
dateTextView.setText(date);
}
}
和你想打开的classNewWorkoutItemFragment
只需要让这个对话框的对象class像
newWorkDialog= new NewWorkoutItemFragment();
NewWorkoutItemFragment newWorkDialog;
newWorkDialog= NewWorkoutItemFragment.newInstance("T");
newWorkDialog.show(manager,"Show");
在样式文件中只需添加以下行
<style name="CustomDialog" parent="Theme.AppCompat.Light.Dialog">
<item name="android:windowAnimationStyle">@style/CustomDialogAnimation</item>
</style>
<style name="CustomDialogAnimation">
<item name="android:windowEnterAnimation">@anim/translate_left_side</item>
<item name="android:windowExitAnimation">@anim/translate_right_side</item>
</style>
并在 res
中创建一个新包并将其命名为 anim
并在 anim
文件夹中创建两个文件 transition_left_side
和 transition_right_side
.
transition_left_side
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="600"
android:fromXDelta="100%"
android:toXDelta="0%"/>
和 transition_right_side
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0%" android:toXDelta="100%"
android:fromYDelta="0%" android:toYDelta="0%"
android:duration="600"/>
我想这不会造成任何进一步的错误。
解决方案根本与 datepickerdialog
无关。我的片段中有一个 switch-case 来管理点击事件。我不小心忘记在导致流向其他事件(其中一个是 dismiss();
)的案例之后放一个 break;
,这就是为什么 datepickerdialog 也忽略了我的片段。