2011-07-12 39 views

回答

4

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

Show dialog from fragment?

和这里有很大帮助:

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

这似乎是工作...虽然我无法弄清楚如何尚未更新上调用该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(" ")); 

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

(请注意,构造函数接受的是片段使用这个对话框 - 并且我们使用这个参考作为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 
} 
} 

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

FragmentTransaction ft = getFragmentManager().beginTransaction(); 
DialogFragment newFragment = new DatePickerDialogFragment(this); 
newFragment.show(ft, "dialog"); 

不知道这是做的最好办法,但似乎很好地工作。

+0

你在哪里使用“prev”? –

+0

我有一个edittext,它应该有一个日期。我从这个edittext中设置onClicklistener来按照你的方式打开这个片段,并且它正在工作。问题是键盘也打开了。我该如何解决这个问题?谢谢 –

+0

@PauloBarros“prev”是用这个标签(比如另一个对话框)去除屏幕上的任何以前的片段,但在这个例子中没有使用。我更新了代码,没有它。 – NPike

5

以前的浏览器解释得不够好,但这里是我如何更改DialogFragmentDateSet方法的视图。

您可以将您想要更改的视图传递给扩展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)); 
    } 
} 

然后,你可以展示你的片段是这样的:

public void showDatePickerDialog(View v) { 
    new DatePickerFragment((EditText) v).show(getSupportFragmentManager(), "datePicker"); 
} 

设置要更改的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> 
+0

作品。谢谢你 –

17

虽然上述回答可能的工作,我相信我有一个更简单的解决方案:

DatePickerDialog dialog = new DatePickerDialog(getActivity(), datePickerListener, 
          2000, 1,1); 
dialog.show(); 

哪里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 
     } 
}; 
+0

优秀的答案,谢谢 –

+0

简单而有效。与TimePickerDialog一起使用也很棒。 – bob

+0

谢谢..我只是爱你..只有2行结束了我过去4小时的研究..多么愚蠢的Iam .. – Sayka

1

这里是一个片段在想用datepicker的片段中:

private Callbacks mCallbacks; 
private String tag; 

/** 
* A callback interface that all fragments/activities containing this fragment must 
* implement. This mechanism allows activities to be notified of item 
* selections. 
*/ 
public interface Callbacks { 
    /** 
    * Callback for when an item has been selected. 
    */ 
    public void onSelected(Date date, String tag); 
} 





    public static DatePickerFragment newInstance(Fragment fragment, 
               Date date, String tag)   { 
    DatePickerFragment dateFragment = new DatePickerFragment(); 
    Calendar c = Calendar.getInstance(); 
    if (date != null) { 
     c.setTime(date); 
    } 
    dateFragment.setYear(c.get(Calendar.YEAR)); 
    dateFragment.setMonth(c.get(Calendar.MONTH)); 
    dateFragment.setDay(c.get(Calendar.DAY_OF_MONTH)); 
    dateFragment.setmCallbacks((Callbacks) fragment); 
    dateFragment.setTag(tag); 
    return dateFragment; 
} 

public void onDateSet(DatePicker view, int year, int month, int day) { 
    // Do something with the date chosen by the user 
    Calendar cal = Calendar.getInstance(); 
    cal.set(year, month, day); 
    date = new Date(cal.getTime().getTime()); 
    setType(1); 
    mCallbacks.onSelected(date,tag); 
} 

,并在您的片段:

public class DetailFragment extends Fragment implements 
    DatePickerFragment.Callbacks { 

。 。 。

private void startDatePicker(String tag) { 

    DialogFragment newFragment = DatePickerFragment.newInstance(this, 
      invoiceModell.getInvoice().getInvoiceDate(), tag); 
    newFragment.show(getActivity().getSupportFragmentManager(), 
      "datePicker"); 
} 


    @Override 
public void onSelected(Date date, String tag) { 
    if (tag.equals(FIRSTDATE)) 
     invoiceModell.getInvoice().setInvoiceDate(date); 
    else if (tag.equals(SECONDDATE)) 
     invoiceModell.getInvoice().setDueDate(date); 
} 
相关问题