【问题标题】:Android: reuse datepickerAndroid:重用日期选择器
【发布时间】:2012-04-15 17:51:20
【问题描述】:

我需要 DatePicker 的帮助。我按照教程 developer/android.com 创建了我的日期选择器。问题是我需要在几乎所有的活动中使用日期选择器.. 那么,如何在其他活动中重用我的MyDatePicker 类,而不必每次都编写所有代码?

编辑2:

public class MyDatePicker extends DatePicker {

                    private EditText mDateDisplay; 
                    private Button mPickDate;
                    private int mYear;
                    private int mMonth;
                    private int mDay;

                    static final int DATE_DIALOG_ID = 0;

                    public MyDatePicker(Context context, AttributeSet attrs, int defStyle) {
                        super(context, attrs, defStyle);
                                           ///all methods 

我不仅需要布局中的简单小部件,还需要一个通过按下按钮打开的小部件。这会改变我的 EditText 字段。 将“地址类”放在布局编译器中告诉我:无法实例化以下类:MyDatePicker。

【问题讨论】:

    标签: java android android-activity datepicker


    【解决方案1】:

    看看这个

    class MyDataPicker extends DatePickerDialog{
        int year,  monthOfYear, dayOfMonth;
        final Calendar c;
        Date d1;
        public MyDataPicker(Context context, DatePickerDialog.OnDateSetListener callBack, int year, int monthOfYear, int dayOfMonth){ 
            super(context,  callBack, year, monthOfYear, dayOfMonth);
            this.year=year;  this.monthOfYear=monthOfYear; this.dayOfMonth=dayOfMonth;
             d1= new Date(year,  monthOfYear, dayOfMonth);
            c = Calendar.getInstance();
            // TODO Auto-generated constructor stub
        }
    
        public void onDateChanged(DatePicker datepicker, int year, int month, int day){
                long timeinmilies = d1.getTime();
                Date d = new Date(year, month,day);
                long millis = d.getTime();
                if(millis<=timeinmilies){
                    this.year = year; this.monthOfYear = month; this.dayOfMonth = day;
                }
                datepicker.updateDate(this.year,  monthOfYear, dayOfMonth);
                super.onDateChanged(datepicker,this.year,  monthOfYear, dayOfMonth);
        }
    }
    
    
    
    
    
    
    private DatePickerDialog.OnDateSetListener myDateSetListener
      = new DatePickerDialog.OnDateSetListener(){
       @Override
       public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
    
        // TODO Auto-generated method stub
    
        // set Date in EditText or textView Here
    
        DOB.setText((monthOfYear+1)+"-"+dayOfMonth+"-"+year);
       }
    
    
     };
    
    
    
    // button click to open datepicker
    
    public void onClickPickDate(View view){
        final Calendar c = Calendar.getInstance();
        int myYear = c.get(Calendar.YEAR);
        int myMonth = (c.get(Calendar.MONTH));
        int  myDay = c.get(Calendar.DAY_OF_MONTH);
    
      MyDataPicker datePickerDialog =  new MyDataPicker(this,myDateSetListener,myYear, myMonth, myDay);
    
      datePickerDialog.show();
    }
    

    【讨论】:

      【解决方案2】:

      通过扩展 datepicker 来创建一个 clss 以拥有你的功能,并像任何其他组件一样通过 xml 布局简单地使用它。你可以使用 lke 的东西

       <com.yourpackagename.yourdatepickerclass....
      

      【讨论】:

      • y,我不仅需要布局中的简单小部件,还需要一个通过按下按钮打开的小部件。这会改变我的 EditText 字段。我需要在许多活动中重用这个功能......像这样:developer.android.com/resources/tutorials/views/… 我需要在我的所有活动中使用这个
      • 代码中没有错误,当我尝试打开活动时它给了我错误..对不起。我解释得很糟糕
      【解决方案3】:

      由于您已经制作了自定义日期选择器,因此只需将其指定为布局的一部分,您就可以在任何布局中将其作为普通视图重用。例如:

      <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res/jembalang.comfest.game"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <com.game.MyDatePicker
          android:id="@+id/game_view"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent">
        </com.game.MyDatePicker>
        <Button 
          android:text="Button" 
          android:id="@+id/button1" 
          android:layout_width="wrap_content" 
          android:layout_height="wrap_content">
        </Button>
      </LinearLayout>
      

      您需要通过指定 packagename.customviewname 来使用它。在上面的示例中,com.game 是保存 MyDatePicker 的包。

      【讨论】:

      • 你是如何实例化的。发布一些代码。另外,请不要为您的活动使用名称 DatePicker。通常像这样的小事情会导致问题
      • 现在我很困惑,你已经创建了一个名为 DatePicker 的活动。然后你试图在 MyDatePicker 中扩展它。我说的是 android 中的 DatePicker 小部件。
      • 对不起。我解释得很糟糕..我不仅需要布局中的简单小部件,我还需要一个通过按下按钮打开的小部件..这会改变我的 EditText 字段。将“地址类”放在布局编译器中告诉我:无法实例化以下类:MyDatePicker。编辑2。感谢您的帮助,抱歉我的解释不好..我是新手qq
      • 例如developer.android.com/resources/tutorials/views/… 我需要在我的所有活动中使用它,而无需重写每个活动中的所有代码
      【解决方案4】:

      首先我要解释一下英语不是我的母语语言,但我希望你理解我为你写的内容

      我想我能帮你解决什么问题

      首先创建一个类,它将成为你的屏幕对话框

      class DatePickerFragment(
      private val contextP: Context,
      private val listener: DatePickerDialog.OnDateSetListener) : 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)
          val picker = DatePickerDialog(contextP, listener, year, month, day)
          val today = c.timeInMillis
          picker.datePicker.minDate = today
          return picker
      }
      
      companion object {
          fun newInstance(
              listener: DatePickerDialog.OnDateSetListener,
              contextP: Context
          ): DatePickerFragment {
              return DatePickerFragment(contextP, listener)
          }
      }
       }
      

      然后创建此函数以重用一个文件或可以在一个伴随对象中

      fun showDatePickerDialog(listener: DatePickerDialog.OnDateSetListener, fragment: Fragment) {
      val newFragment =
          DatePickerFragment.newInstance(listener, fragment.requireContext())
      fragment.activity?.let { newFragment.show(it.supportFragmentManager, "datePicker") }
      }
      

      然后在你的片段中实现这个监听器

      DatePickerDialog.OnDateSetListener
      

      然后重写方法

      override fun onDateSet(datePicker: DatePicker?, year: Int, month: Int, day:Int) {
          //code what fire when the date is is set
      }
      

      然后在您的活动或片段中调用此函数,例如在一个侦听器中

       binding.selectDate.setOnClickListener {
              showDatePickerDialog(this,this)
          }
      

      第一个 this 在你的片段中引用你的监听器(DatePickerDialog.OnDateSetListener),第二个 this 是你的片段,是所有 使用此代码,您可以在您想要的地方重用对话框

      【讨论】:

        猜你喜欢
        • 2014-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-18
        相关资源
        最近更新 更多