【问题标题】:showing a DatePickerDialog inside a Dialogfragment在 Dialogfragment 中显示 DatePickerDialog
【发布时间】:2018-11-24 17:10:57
【问题描述】:

我创建了一个DialogFragment,它有一个EditText,当用户按下EditText 时,会有一个新的DatePickerDialog,假设从用户那里选择一个日期,然后将其设置在DialogFragment .我很难做到这一点:

  1. DatePickerDialog 实际出现但破坏了旧的DialogFragment。当我点击确定/无论我返回活动时。
  2. 我想将我选择的日期传递回片段。如果我想将它传递回活动会更容易,因为我可以使用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
}
}

【问题讨论】:

  • 您应该使用 'com.wdullaer:materialdatetimepicker:2.3.0' 库来处理 datepickertimepicker 对话框。
  • @Raza 我要试试,会更新结果

标签: android android-dialogfragment


【解决方案1】:

您应该将'com.wdullaer:materialdatetimepicker:2.3.0' 库用于datepickertimepicker 对话框。
首先在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);
}


}

和你要打开的类NewWorkoutItemFragment只要把这个对话框类的对象设为

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_sidetransition_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"/>

我想这不会产生任何进一步的错误。

【讨论】:

  • 这段代码有太多错误,即mUnbinder 处于“无法解决此问题..”
  • 这些是我必须使用的变量,您可以全局声明这些变量或仅注释这些变量。并编写您自己的变量。
  • 私有解绑器 mUnbinder;这是在 onCreateView 内部初始化为 mUnbinder = ButterKnife.bind(this, view); 的全局变量
  • 感谢您的好意,但我设法解决了我的问题,这与我的 DatePickerDialog 无关。这是一个愚蠢的。我会发布一个解决方案。 p.s:我现在使用 'com.wdullaer:materialdatetimepicker:2.3.0' 库日期选择器,只是因为我喜欢这些主题。谢谢
【解决方案2】:

解决方案根本与datepickerdialog 无关。我的片段中有一个开关盒,用于管理点击事件。我不小心忘记在导致其他事件(其中一个是dismiss();)的案例之后添加break;,这就是为什么datepickerdialog 也忽略了我的片段。

【讨论】:

    猜你喜欢
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多