【问题标题】:datePickerDialog Fragment, getting variables in Main ActivitydatePickerDialog Fragment,获取Main Activity中的变量
【发布时间】:2014-07-08 03:55:22
【问题描述】:

我正在尝试解决一个奇怪的问题。我是 Android 编程的新手(以及这个网站作为海报),所以请耐心等待。我有一个从我的 Main Activity 调用的 datePickerDialog,并且该类中的 TextView 正确更新了年、月和日期,但是由于某种原因,当我使用 getter 在我的主 Activity 中获取年、月和日期时,它只是返回 0。我使用 getter 是否做错了什么?

// Activity Method

public void showDatePickerDialog(View v) {
    DialogFragment newFragment = new DatePickerFragment();
    newFragment.show(getFragmentManager(), "datePicker");
    firstDatem = ((DatePickerFragment) newFragment).getMonth();
    firstDated = ((DatePickerFragment) newFragment).getDay();
    firstDatey = ((DatePickerFragment) newFragment).getYear();
}

// DatePickerDialog

private int year;
private int month;
private int day;


public void onDateSet(DatePicker view, int year, int month, int day) {
    // do some stuff for example write on log and update TextField on activity
    String monthstring;
    switch ( month ) {
        case 0: monthstring = "January";
                break;
        case 1: monthstring = "February";
                break;
        case 2: monthstring = "March";
                break;
        case 3: monthstring = "April";
                break;
        case 4: monthstring = "May";
                break;
        case 5: monthstring = "June";
                break;
        case 6: monthstring = "July";
                break;
        case 7: monthstring = "August";
                break;
        case 8: monthstring = "September";
                break;
        case 9: monthstring = "October";
                break;
        case 10: monthstring = "November";
                break;
        case 11: monthstring = "December";
                break;
        default:
                monthstring = "";
                break;
    }
    ((TextView) getActivity().findViewById(R.id.date_text)).setText( "First date set to " + monthstring + " " + day + ", "+ year); 
}
public int getYear()
{
    return year;
}
public int getMonth()
{
    return month;
}
public int getDay()
{
    return day;
}
}

【问题讨论】:

标签: java android android-activity android-fragments android-datepicker


【解决方案1】:

你应该让你的 DatePickerDialog 回调你的 MainActivity。这将使事情变得更容易和更清洁。下面是这个模式如何与一些 cmets 一起工作的示例:

像这样创建一个 DatePickerDialogFragment:

public class DatePickerDialogFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener
{
    // This interface is implemented by this fragment's container activity.
    // In your case, it will be implemented by MainActivity.
    // When the container activity creates an instance of this fragment, it passes in a reference to this
    // method.  This allows the current fragment to use that reference to pass the entered date values back 
    // to that container activity as soon as they are entered by the user.
    public static interface DatePickedListener
    {
        public void onDatePicked(int selectedYear, int selectedMonth, int selectedDay);
    }

    private DatePickedListener listener;


    @Override
    public void onAttach(Activity activity)
    {
        // when the fragment is initially attached to the activity, 
        // cast the activity to the callback interface type
        super.onAttach(activity);

        try
        {
            listener = (DatePickedListener) activity;
        }
        catch (ClassCastException e)
        {
            throw new ClassCastException(activity.toString() + 
                " must implement " + DatePickedListener.class.getName());
        }
    }


    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState)
    {

        // the activity passes in these arguments when it 
        // creates the dialog. use them to create the dialog
        // with these initial values set
        Bundle b = getArguments();

        int year = b.getInt("set_year");
        int month = b.getInt("set_month");
        int day = b.getInt("set_day");

        return new DatePickerDialog(getActivity(), this, year, month, day);
    }


    @Override
    public void onDateSet(DatePicker view, int setYear, int setMonth, int setDay)
    {
        // when the date is selected, immediately send it to the activity via 
        // its callback interface method

        listener.onDatePicked(setYear, setMonth, setDay);
    }

}

让您的 MainActivity 按照定义实现 DatePickerDialogFragment.DatePickedListener 接口 在上面的 DatePickerDialogFragment 中。然后在你的MainActivity中,当用户按下按钮时显示 日期选择器,在事件处理程序中有这样的东西:

Calendar cal = Calendar.getInstance();

Bundle b = new Bundle();  // create a bundle object to pass currently set date to DatePickerDialogFragment

b.putInt("set_year", cal.get(Calendar.YEAR));  
b.putInt("set_month", cal.get(Calendar.MONTH)); 
b.putInt("set_day", cal.get(Calendar.DAY_OF_MONTH)); 

// show the date picker fragment (which contains a date picker dialog)
DialogFragment datePickerDialogFragment = new DatePickerDialogFragment();
datePickerDialogFragment.setArguments(b);  // set the bundle on the DatePickerDialogFragment        
datePickerDialogFragment.show(getSupportFragmentManager(), TAG_DATE_PICKER_FRAGMENT);   

当用户选择一个日期时,onDateSet 将在您的日期选择器片段中调用,并且 将调用 listener.onDatePicked(setYear, setMonth, setDay),它在你的 主要活动。因此,您的 MainActivity 无需使用任何类型的 getter 方法来 检索结果 - 当用户完成日期时自动返回结果 对话框。

【讨论】:

猜你喜欢
  • 2021-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-19
  • 2020-02-19
  • 1970-01-01
  • 1970-01-01
  • 2013-08-27
相关资源
最近更新 更多