【问题标题】:Android how to show DatePicker in Fragment?Android如何在片段中显示DatePicker?
【发布时间】:2015-01-29 07:21:04
【问题描述】:

我是 Android 片段的新手,我想知道如何以简单的 Fragment 而不是 FragmentActivity 显示或实现 DatePicker

例如我的班级名称是:

public class FragmentAddCard extends Fragment {
}

谢谢。

【问题讨论】:

  • 到目前为止您尝试过什么?发布一些代码来展示你的努力,然后寻求帮助。

标签: android android-fragments android-datepicker


【解决方案1】:

在您的按钮中单击调用 DateFragment 像这样

   dob.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {

            DialogFragment newFragment = new SelectDateFragment();
            newFragment.show(getFragmentManager(), "DatePicker");

        }
    });

这是 DateFragment 的代码 sn-p

  public class SelectDateFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {

        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
        final Calendar calendar = Calendar.getInstance();
        int yy = calendar.get(Calendar.YEAR);
        int mm = calendar.get(Calendar.MONTH);
        int dd = calendar.get(Calendar.DAY_OF_MONTH);
        return new DatePickerDialog(getActivity(), this, yy, mm, dd);
        }

        public void onDateSet(DatePicker view, int yy, int mm, int dd) {
            populateSetDate(yy, mm+1, dd);
        }
        public void populateSetDate(int year, int month, int day) {
            dob.setText(month+"/"+day+"/"+year);
            }

    }

【讨论】:

  • 在日期片段类中。我无法解决dob。请帮忙
  • @Sagar Devanga 是TextView来显示选中的日期
  • 我知道,但我在不同的类中都有这两种东西,我怎样才能传递 dob 的引用或附加监听器。因为它不允许我使用侦听器创建构造函数并要求我使用默认构造函数。
  • 看到我在一个活动中有两个片段都有这个日期片段..但有时它适用于一个片段,有时适用于第二个片段......
  • TextView dob= (TextView)getActivity(). findViewById(R.id.dob); 在 Activity 中运行时应该修复错误
【解决方案2】:

这是另一个例子:

Calendar cal = Calendar.getInstance(TimeZone.getDefault()); // Get current date

// Create the DatePickerDialog instance
DatePickerDialog datePicker = new DatePickerDialog(this,
                    R.style.AppBlackTheme, datePickerListener,
                    cal.get(Calendar.YEAR), 
                                        cal.get(Calendar.MONTH),
                    cal.get(Calendar.DAY_OF_MONTH));
            datePicker.setCancelable(false);
            datePicker.setTitle("Select the date");
datePicker.show();

// Listener
private DatePickerDialog.OnDateSetListener datePickerListener = new DatePickerDialog.OnDateSetListener() {

    // when dialog box is closed, below method will be called.
    public void onDateSet(DatePicker view, int selectedYear,
            int selectedMonth, int selectedDay) {
        String year1 = String.valueOf(selectedYear);
        String month1 = String.valueOf(selectedMonth + 1);
        String day1 = String.valueOf(selectedDay);
        TextView tvDt = (TextView) findViewById(R.id.tvDate);
        tvDt.setText(day1 + "/" + month1 + "/" + year1);

    }
};

【讨论】:

    【解决方案3】:

    首先我可以说,选定的答案工作正常。这是一个好方法。但是,如果您想将MaterailDatePicker 与 Fragment 一起使用。我找到了解决方案。尝试在 Fragment 中设置 DatePicker。

    Gradle

    dependencies {
      compile 'com.wdullaer:materialdatetimepicker:3.1.3'
    }
    

    日期选择器片段

    package com.wdullaer.datetimepickerexample;
    
    import android.app.Fragment;
    import android.graphics.Color;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.Button;
    import android.widget.CheckBox;
    import android.widget.TextView;
    
    import com.wdullaer.materialdatetimepicker.date.DatePickerDialog;
    
    import java.util.Calendar;
    
    /**
     * A simple {@link Fragment} subclass.
     */
    public class DatePickerFragment extends Fragment implements DatePickerDialog.OnDateSetListener {
    
        private TextView dateTextView;
        private CheckBox modeDarkDate;
        private CheckBox modeCustomAccentDate;
        private CheckBox vibrateDate;
        private CheckBox dismissDate;
        private CheckBox titleDate;
        private CheckBox showYearFirst;
        private CheckBox showVersion2;
        private CheckBox limitSelectableDays;
        private CheckBox highlightDays;
    
        public DatePickerFragment() {
            // Required empty public constructor
        }
    
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.datepicker_layout, container, false);
    
            // Find our View instances
            dateTextView = (TextView) view.findViewById(R.id.date_textview);
            Button dateButton = (Button) view.findViewById(R.id.date_button);
            modeDarkDate = (CheckBox) view.findViewById(R.id.mode_dark_date);
            modeCustomAccentDate = (CheckBox) view.findViewById(R.id.mode_custom_accent_date);
            vibrateDate = (CheckBox) view.findViewById(R.id.vibrate_date);
            dismissDate = (CheckBox) view.findViewById(R.id.dismiss_date);
            titleDate = (CheckBox) view.findViewById(R.id.title_date);
            showYearFirst = (CheckBox) view.findViewById(R.id.show_year_first);
            showVersion2 = (CheckBox) view.findViewById(R.id.show_version_2);
            limitSelectableDays = (CheckBox) view.findViewById(R.id.limit_dates);
            highlightDays = (CheckBox) view.findViewById(R.id.highlight_dates);
    
            // Show a datepicker when the dateButton is clicked
            dateButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Calendar now = Calendar.getInstance();
                    DatePickerDialog dpd = DatePickerDialog.newInstance(
                            DatePickerFragment.this,
                            now.get(Calendar.YEAR),
                            now.get(Calendar.MONTH),
                            now.get(Calendar.DAY_OF_MONTH)
                    );
                    dpd.setThemeDark(modeDarkDate.isChecked());
                    dpd.vibrate(vibrateDate.isChecked());
                    dpd.dismissOnPause(dismissDate.isChecked());
                    dpd.showYearPickerFirst(showYearFirst.isChecked());
                    dpd.setVersion(showVersion2.isChecked() ? DatePickerDialog.Version.VERSION_2 : DatePickerDialog.Version.VERSION_1);
                    if (modeCustomAccentDate.isChecked()) {
                        dpd.setAccentColor(Color.parseColor("#9C27B0"));
                    }
                    if (titleDate.isChecked()) {
                        dpd.setTitle("DatePicker Title");
                    }
                    if (highlightDays.isChecked()) {
                        Calendar date1 = Calendar.getInstance();
                        Calendar date2 = Calendar.getInstance();
                        date2.add(Calendar.WEEK_OF_MONTH, -1);
                        Calendar date3 = Calendar.getInstance();
                        date3.add(Calendar.WEEK_OF_MONTH, 1);
                        Calendar[] days = {date1, date2, date3};
                        dpd.setHighlightedDays(days);
                    }
                    if (limitSelectableDays.isChecked()) {
                        Calendar[] days = new Calendar[13];
                        for (int i = -6; i < 7; i++) {
                            Calendar day = Calendar.getInstance();
                            day.add(Calendar.DAY_OF_MONTH, i * 2);
                            days[i + 6] = day;
                        }
                        dpd.setSelectableDays(days);
                    }
                    dpd.show(getFragmentManager(), "Datepickerdialog");
                }
            });
    
            return view;
        }
    
        @Override
        public void onResume() {
            super.onResume();
            DatePickerDialog dpd = (DatePickerDialog) getFragmentManager().findFragmentByTag("Datepickerdialog");
            if(dpd != null) dpd.setOnDateSetListener(this);
        }
    
        @Override
        public void onDateSet(DatePickerDialog view, int year, int monthOfYear, int dayOfMonth) {
            String date = "You picked the following date: "+dayOfMonth+"/"+(++monthOfYear)+"/"+year;
            dateTextView.setText(date);
        }
    }
    

    【讨论】:

      【解决方案4】:
        button_name.setOnTouchListener(new View.OnTouchListener() {
          @Override
          public boolean onTouch(View v, MotionEvent event) {
      
              switch (event.getAction()){
                  case MotionEvent.ACTION_DOWN:
                      DatePickerDialog datePickerDialog = DatePickerDialog.newInstance(new DatePickerDialog.OnDateSetListener() {
                           @Override
                           public void onDateSet(DatePickerDialog view, int year, int monthOfYear, int dayOfMonth) {
                               String years=""+year;
                               String months=""+(monthOfYear+1);
                               String days=""+dayOfMonth;
                               if(monthOfYear>=0 && monthOfYear<9){
                                   months="0"+(monthOfYear+1);
                               }
                               if(dayOfMonth>0 && dayOfMonth<10){
                                   days="0"+dayOfMonth;
      
                               }
                               race_date.setText(months+"/"+days+"/"+years);
                           }
                       }, now.get(Calendar.YEAR),
                              now.get(Calendar.MONTH),
                              now.get(Calendar.DAY_OF_MONTH));
                      datePickerDialog.setMinDate(now);
                      datePickerDialog.show(getActivity().getFragmentManager(), "Datepicker");
                      break;
              }
              return false;
          }
      });
      

      【讨论】:

      • 感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。 proper explanation 将通过展示为什么这是解决问题的好方法,并使其对有其他类似问题的未来读者更有用,从而大大提高其长期价值。请edit您的回答添加一些解释,包括您所做的假设。 ref
      猜你喜欢
      • 1970-01-01
      • 2016-11-06
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 2016-09-15
      • 1970-01-01
      • 1970-01-01
      • 2015-07-19
      相关资源
      最近更新 更多