如何在片段类中创建datePicker和timePicker对话框?

yos*_*i24 17 android

我想知道有没有办法在片段中创建一个datePicker?我正在创建一个常规活动可能,它给我语法错误.这样做的正确方法是什么?

NPi*_*ike 22

扩展Codejoy的答案:

这是我的DatePickerDialogFragment类:

public class DatePickerDialogFragment extends DialogFragment {
    private Fragment mFragment;

    public DatePickerDialogFragment(Fragment callback) {
        mFragment = callback;
    }

     public Dialog onCreateDialog(Bundle savedInstanceState) {
         return new DatePickerDialog(getActivity(), (OnDateSetListener) mFragment, 1980, 7, 16);
     }
}
Run Code Online (Sandbox Code Playgroud)

(请注意,构造函数接受使用此对话框的片段 - 我们将此引用用于DatePickerDialog的回调侦听器字段)

我的片段然后只实现onDateSetListener:

public class SignupFragment extends Fragment implements OnDateSetListener {
...
public void onDateSet(DatePicker view, int year, int monthOfYear,
            int dayOfMonth) {
    // do stuff with the date the user selected
}
}
Run Code Online (Sandbox Code Playgroud)

...然后我从我的片段中显示对话框,如下所示:

FragmentTransaction ft = getFragmentManager().beginTransaction();
DialogFragment newFragment = new DatePickerDialogFragment(this);
newFragment.show(ft, "dialog");
Run Code Online (Sandbox Code Playgroud)

不确定这是否是最好的方法,但似乎工作正常.

  • 我相信这段代码会在屏幕旋转时崩溃,因为DialogFragment没有默认的空构造函数. (4认同)

Bar*_*urg 17

虽然以上答案可能有效,但我相信我有一个更简单的解决方案:

DatePickerDialog dialog = new DatePickerDialog(getActivity(), datePickerListener, 
                             2000, 1,1);
dialog.show();
Run Code Online (Sandbox Code Playgroud)

其中datePickerListerener是这样的:

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) {
            //Do whatever you want
        }
};
Run Code Online (Sandbox Code Playgroud)


小智 5

以前的anwsers正在解释得足够好,但这里是我如何更改DialogFragment的onDateSet方法的视图.

您可以将要更改的视图传递给扩展DialogFragment的类的构造函数.然后调用类的setText方法onDateSet方法.这是代码:

public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {

public EditText activity_edittext;

public DatePickerFragment(EditText edit_text) {
    activity_edittext = edit_text;
}

@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);
}

    @Override
    public void onDateSet(DatePicker view, int year, int month, int day) {
        activity_edittext.setText(String.valueOf(month + 1 ) + "/" + String.valueOf(day) + "/" + String.valueOf(year));
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样显示你的片段:

public void showDatePickerDialog(View v) {
    new DatePickerFragment((EditText) v).show(getSupportFragmentManager(), "datePicker");
}
Run Code Online (Sandbox Code Playgroud)

将此方法设置为要更改的EditText的onClick方法.像这样:

    <EditText
            android:id="@+id/editTextToShowDate"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:ems="10"
            android:focusable="false"
            android:inputType="date"
            android:onClick="showDatePickerDialog" >
   </EditText>
Run Code Online (Sandbox Code Playgroud)


Cod*_*joy 4

您很可能需要使用 DialogFragment。我在这里找到了一些信息:

显示片段中的对话框?

这里也有很大的帮助:

https://github.com/commonsguy/cw-advandroid/blob/master/Honeycomb/FeedFragments/src/com/commonsware/android/feedfrags/AddFeedDialogFragment.java

这应该可以帮助你上路,我现在正在做这件事。尽管在示例代码中我不使用构建器,而是仅返回:

return new DatePickerDialog(getActivity(), mDateSetListener, mYear, mMonth, mDay);
Run Code Online (Sandbox Code Playgroud)

这似乎有效......尽管我还不知道如何更新调用此 DialogFragment 的片段上的文本。我以为这会起作用,但事实并非如此:

 public void updateDisplay()
 {
     //update our button text from the calling fragment, this isn't quite working
     //doesn't crash just doesn't update...must be missing something.
     View v=getActivity()
        .getLayoutInflater()
        .inflate(R.layout.session_edits, null);
     Button sessionDate = (Button)v.findViewById(R.id.sessionPickDate);
            sessionDate.setText(new StringBuilder()
                            .append(mMonth+1).append("-").append(mDay).append("-").append(mYear).append(" "));

 }
Run Code Online (Sandbox Code Playgroud)