【问题标题】:How to return the date value from DatePickerDialog in Android?如何从 Android 中的 DatePickerDialog 返回日期值?
【发布时间】:2012-11-27 04:10:29
【问题描述】:

我是安卓新手。我使用以下指南在 android 中创建了一个日期选择器。http://developer.android.com/guide/topics/ui/controls/pickers.html

 public  class DatePickerFragment extends DialogFragment
  implements DatePickerDialog.OnDateSetListener {



StringBuilder sb = new StringBuilder();
public static String date;
    @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);
   }

  public void onDateSet(DatePicker view, int year, int month, int day) {
   // Do something with the date chosen by the user


sb.append(year);
sb.append('-');
sb.append(month+1);
sb.append('-');
sb.append(day);

date = sb.toString();
System.out.println("The date is "+date);

    }

我需要将此日期值 (date = sb.toString()) 返回到我的 MainActivity 。既然 onDateSet 方法是 void 我该怎么办?

附加信息 - DatePickerDialog 在 MainActivity 类中触发,但不是单键单击。单个按钮中会发生多个过程,日期选择器仅在满足特定条件时才会触发。我也不想显示日期值。只是希望它返回以进行进一步处理。

感谢任何形式的指导

改变了 onDataset 方法和 justshow()

public void onDateSet(DatePicker view, int year, int month, int day) {

// 用用户选择的日期做某事

    sb.append(year);
    sb.append('-');
    sb.append(month+1);
    sb.append('-');
    sb.append(day);

    date = sb.toString();
    MainActivity.newdate=sb.toString();
    System.out.println("The date is "+MainActivity.newdate);

} public void justShow(){

System.out.println("The date is "+MainActivity.newdate);

}

这是来自 Main 的相关部分(在第一次回复中建议进行更改后)

    DateToken mydate=new DateToken();
    String test=dayvals.get(0);
    DialogFragment df=new DatePickerFragment();

    if(test.equalsIgnoreCase("day")){


        df.show(getSupportFragmentManager(), "DatePik");

    }

    System.out.println("Date is on Main"+newdate);


  DatePickerFragment dpf=new DatePickerFragment();
  dpf.justShow();

newdate 是静态 String ,但仍输出 null。在 MainActivity 和 justShow 方法中。但在 onDataSet 方法中日期输出正确

【问题讨论】:

  • This 是您需要的确切参考

标签: android datepicker


【解决方案1】:
  • 您可以在 DatePickerFragment 中创建一个公共方法来返回字符串。
  • 您可以在 MainActivity 中有一个静态变量供此类写入。
  • 您可以使用 SharedPreferences 来存储字符串。

我会选择第一个选项,如果您的应用程序是基本的,这是最简单的。

如您所见,有多种方法可以解决此问题,因此了解用户如何与您的应用交互以及何时需要该日期非常重要。如果您在 MainActivity 中持有对 Fragment 的引用并且您不需要尽快获得数据,则公共返回方法很好。 如果您需要在用户选择日期后立即更改字符串,则静态变量很好。 最后一种方法很浪费,最不推荐,但没有做静态的“魔术”。

【讨论】:

  • 感谢您的回复。我必须在 onDataSet 方法中构建字符串,该方法应该是 void 。如何将生成的值传递给另一个方法?我尝试遵循 public void justShow(){ System.out.println("The date is "+date);但是当我调用 justshow() 方法时,它会将 date 设置为 null ,并且在 onDataset 方法之前执行(我不知道为什么)。所以我要试试你的第二个选择
【解决方案2】:

虽然这是 4 年前提出的,并且最后一次活跃是在 1 年前(正如我的回答)。我希望以下内容有所帮助。

package com.example.fragments;

import java.util.Calendar;

import android.app.DatePickerDialog;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.widget.DatePicker;

/**
 * Date picker fragment bit 18/03/2017.
 */

public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {

  private OnDateSetListener callbackListener;

  /**
   * An interface containing onDateSet() method signature.
   * Container Activity must implement this interface.
   */
  public interface OnDateSetListener {
    void onDateSet(DatePicker view, int year, int month, int dayOfMonth);
  }

  /* (non-Javadoc)
   * @see android.app.DialogFragment#onAttach(android.app.Activity)
   */
  @Override
  public void onAttach(Context activity) {
    super.onAttach(activity);

    try {
      callbackListener = (OnDateSetListener) activity;

    } catch (ClassCastException e) {
      throw new ClassCastException(activity.toString() + " must implement OnDateSetListener.");
    }
  }

  @NonNull
  @Override
  public Dialog onCreateDialog(Bundle savedInstanceState) {
    // Use the current date as the default date in the picker
    final Calendar calendar = Calendar.getInstance(getResources().getConfiguration().locale);
    int year = calendar.get(Calendar.YEAR);
    int month = calendar.get(Calendar.MONTH);
    int day = calendar.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) {
    if (callbackListener != null) {
      callbackListener.onDateSet(view, year, month, dayOfMonth);
    }
  }
}

然后在MainActivity中进行下一步

    public class MainActivity extends AppCompatActivity implements View.OnClickListener, DatePickerFragment.OnDateSetListener {


  private EditText edittextDate;

  private Locale locale;

  private DialogFragment datePicker;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    locale = getResources().getConfiguration().locale;
    datePicker = new DatePickerFragment();

    edittextDate = (EditText) findViewById(R.id.edittextDate);
    edittextDate.setOnClickListener(this);
  }

  @Override
  public void onClick(View v) {
    switch (v.getId()) {

      case R.id.edittextDate: {
        datePicker.show(getSupportFragmentManager(), "datePicker");
        break;
      }
    }
  }

  @Override
  public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
    final Calendar calendar = Calendar.getInstance(locale);
    final DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM, locale);

    if (getCurrentFocus() != null) {
      switch (getCurrentFocus().getId()) {

        case R.id.edittextDate:
          calendar.set(year, month, dayOfMonth);
          edittextDate.setText(dateFormat.format(calendar.getTime()));
          break;
      }
    }
  }
}

【讨论】:

  • 我们如何使用实现DatePickerDialog.OnDateSetListener的对象而不是使用相同的活动?
  • @JCarlos,Activity 或 Fragment 仍然需要实现这个对象(它已经实现了 DatePickerDialog.OnDateSetListener)。尝试在上面的 _DatePickerFragment_ 和 MainActivity 中显示此内容。
【解决方案3】:

在您的活动中实现一个侦听器接口并将其传递给 DatePickerFragment。 然后通过调用它的方法来触发监听器。 它在这里描述: http://developer.android.com/guide/topics/ui/dialogs.html#PassingEvents

【讨论】:

    【解决方案4】:

    以下是从 DatePickerDialog 获取日期的方法:

    private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() {
        // onDateSet method
        public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
            myday = dayOfMonth;
            mymonth = monthOfYear + 1;
            myyear = year;
            date = String.valueOf(myday) + getString(R.string.iphan) + String.valueOf(mymonth) + getString(R.string.iphan) + String.valueOf(myyear);
    
            Log.i(TAG,"Date: "+date);
        } 
    }; // DatePickerDialog.OnDateSetListener close
    
    @Override
    protected Dialog onCreateDialog(int id) {
    
        switch (id) {
        case DATE_DIALOG_IDdob:
            // Current Calendar Date
        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);
        return new DatePickerDialog(this, mDateSetListener, year, month, day);
        }
        return null;
    } // onCreateDialog() close
    

    【讨论】:

      【解决方案5】:

      使用以下代码在 onDateSet() 方法中返回 Date 类型的日期

      Date date = new Date(int year, int month, int day);
      

      【讨论】:

      • 感谢回复 onDateSet() 方法必须无效(它不允许我更改)。因此我不能从中返回任何东西
      • @user1855222 在主活动类中声明一个具有公共范围的变量。在 onDateSet() 中赋值。
      • 我做到了。但是当我调用它时仍然给出 NULL 我在进行更改后将 MainActivity 中的相关代码包含在我的问题中。根据 logcat onDateset() 之后执行,我对公共变量的调用。不知道原因
      【解决方案6】:

      在从 DatePickerDialog 类扩展的类上声明一个公共字符串变量,并将所选日期设置为 onDataSet 方法内的公共字符串变量,以便您可以通过您创建的 DatePickerDialog 实例从 MainActivity 访问

      【讨论】:

        【解决方案7】:
        private void openCalendar() {
        DatePickerDialog dialog = new DatePickerDialog(getContext(), (view, year, month, dayOfMonth) -> {
        
            date = getDateString(year, month, dayOfMonth);
        
        }, mYear, mMonth, mDay);
        dialog.show();
        

        }

        private String getDateString(int year, int mMonth, int mDay) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(year, mMonth, mDay);
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        return dateFormat.format(calendar.getTime());
        

        }

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-07
        • 1970-01-01
        • 2013-07-26
        • 2016-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多