【问题标题】:Android Inside custom dialog :- How to open DatePickerDialog?Android Inside 自定义对话框:- 如何打开 DatePickerDialog?
【发布时间】:2019-01-22 12:55:57
【问题描述】:

如果我想从自定义对话框中打开日期选择器对话框,请任何人帮助我,我有一个如下所示的自定义对话框类

public class ReceiptsDialog extends CustomActivity {
    private static ReceiptsDialog instance;
    private static Activity mContext;
    private static Dialog customDialog;
    static EditText tv_date;

    public static ReceiptsDialog getInstance() {
        if (instance == null) {
            instance = new ReceiptsDialog();
        }
        return instance;
    }

    public void createDialog(Activity mContext,Dialogclick dialogclick) {
        this.mContext = mContext;
        this.dialogclick = dialogclick;
        customDialog = new Dialog(mContext);
        customDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        customDialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
        customDialog.setContentView(R.layout.receipts_dialog);
        customDialog.setCanceledOnTouchOutside(false);
        customDialog.show();
        init();
    }

    private void init() {
        tv_date = customDialog.findViewById(R.id.et_date);
        setTouchNClick(tv_date);
    }

    @Override
    public void onClick(View v) {
        super.onClick(v);

        if (v == tv_date) {
            DialogFragment dFragment = new DatePickerFragment();
            dFragment.show(getSupportFragmentManager(), "Date Picker");
        }
    }

    @SuppressLint("ValidFragment")
    public static class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {

        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            final Calendar calendar = Calendar.getInstance();
            int year = calendar.get(Calendar.YEAR);
            int month = calendar.get(Calendar.MONTH);
            int day = calendar.get(Calendar.DAY_OF_MONTH);

            DatePickerDialog dpd = new DatePickerDialog(getActivity(), R.style.MyCalTheme, this, year, month, day);
            return dpd;
        }

        @Override
        public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
            final SimpleDateFormat dateViewFormatter = new SimpleDateFormat("dd-MMM-yyyy", Locale.US);//hh:mm:ss
            Calendar choosen = Calendar.getInstance();
            choosen.set(year, month, dayOfMonth);
            tv_date.setText(dateViewFormatter.format(choosen.getTime()));
        }
    }
}

我想在点击 tv_date 时打开日期选择器对话框

但这会报错:

W/System.err: java.lang.IllegalStateException: 活动已在 android.support.v4.app.FragmentManagerImpl。 enqueueAction (FragmentManager.java:2114) 在 android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:683) 在 android.support.v4.app.BackStackRecord。

提交 (BackStackRecord.java:637) 在 android.support.v4.app.DialogFragment.show(DialogFragment.java:144) 在 com.omegasoftware.olivepos.home.functions.ReceiptsDialog.onClick(ReceiptsDialog.java:141) 在 android.view.View.performClick(View.java:5205) 在 android.view.View$PerformClick.run(View.java:21164) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5417) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)

【问题讨论】:

  • 首先你不应该在Activity派生类中使用operator new,第二:你不应该在任何连接到activity上下文的类中使用static b>
  • ReceiptsDialog 没有被用作Activity,它不应该扩展任何Activity 类。从类声明中删除extends CustomActivity,您将看到哪个方法调用导致了您的问题。
  • @Mike M. 如果我不使用活动扩展它# Fragment.show(getSupportFragmentManager(), "Date Picker");# 此行将导致错误 getSupportFragmentManager/getFragmentManager 不可用我应该使用什么在这种情况下?
  • 嗯,你将 Activity 传递给 createDialog(),所以,从技术上讲,你可以使用它,只要它是一个 AppCompatActivity,然后你先将它转换成这样,或者更改参数和字段类型为AppCompatActivity。但是,您的设置有点不典型。您首先显示一个常规的Dialog,然后显示一个DialogFragment
  • 如果您无法在此处获得AppCompatActivity,那么您将无法获得FragmentManager 的支持。就是这样。

标签: android datepicker dialog


【解决方案1】:

工作解决方案 常规对话框打开日期选择器使用下面的例子

public class ReceiptsDialog extends CustomActivity {
    private Activity mContext;
    private Dialog customDialog;
    EditText tv_date;

    public void createDialog(Activity mContext) {
        this.mContext = mContext;
        customDialog = new Dialog(mContext);
        customDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        customDialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
        customDialog.setContentView(R.layout.receipts_dialog);
        customDialog.setCanceledOnTouchOutside(false);
        customDialog.show();

        init();
    }

    private void init() {
        tv_date = customDialog.findViewById(R.id.et_date);
        setTouchNClick(tv_date);
    }

    @Override
    public void onClick(View v) {
        super.onClick(v);
        if (v == tv_date) {
            View vv = v;
            Calendar c = Calendar.getInstance();
            DatePickerDialog dpd = new DatePickerDialog(mContext,
                new DatePickerDialog.OnDateSetListener() {
                        @Override
                        public void onDateSet(DatePicker view, int year,
                                          int monthOfYear, int dayOfMonth) {
                            String s = dayOfMonth + "-"
                                + (monthOfYear + 1) + "-" + year;
                            tv_date.setText(dayOfMonth + "-"
                                + (monthOfYear + 1) + "-" + year);
                        }
                    }, c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DATE));
            dpd.show();
        }
    }
}

【讨论】:

  • 您是否尝试在显示对话框时旋转屏幕? ...这是在某些情况下工作的解决方案,但不应在生产代码中使用....也可以作为@MikeM。写了...这里没有必要extends CustomActivity
  • 我需要这个扩展,因为我在这个对话框中有很多工作,为平板电脑制作,仅适用于横向模式。它与活动作品相同,但应该看起来像对话框,所以我正在使用它,否则我将其删除
猜你喜欢
  • 2014-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-05
  • 1970-01-01
  • 2013-03-23
相关资源
最近更新 更多