2016-12-03 18 views
0

我想MH在TimePicker onTimeSet not being called的回答了這個問題之後,顯示在一個片段不同TextViews不同的日期設置日期,但我沒有得到一個片段相同的結果。我的代碼是不能工作在多TextViews

我已經加入一個單獨的DatePickerFragment類,其中我使用其被用作一個回調方法和在片段類藥物被定義的接口類。

我如何在一個片段中設置多個日期選擇器?

的DatePickerFragment被寫爲:

public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener { 
    private int mId; 
    DatePickerDialogListener mListener; 
    protected static DatePickerFragment newInstance(int id) { 
     Bundle args = new Bundle(); 
     args.putInt("picker_id", id); 
     DatePickerFragment fragment = new DatePickerFragment(); 
     fragment.setArguments(args); 
     return fragment; 
    } 
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     // ... omitted 
     final Calendar c = Calendar.getInstance(); 
     int mDay = c.get(Calendar.DAY_OF_MONTH); 
     int mMonth = c.get(Calendar.MONTH); 
     int mYear = c.get(Calendar.YEAR); 
     mId = getArguments().getInt("picker_id"); 
     mListener = getActivity() instanceof DatePickerFragment.DatePickerDialogListener ? (DatePickerFragment.DatePickerDialogListener) getActivity() : null; 
     // Create a new instance of TimePickerDialog and return it 
     return new DatePickerDialog(getActivity(), this, mYear, mMonth, mDay); 
    } 
    @Override 
    public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) { 
     if (mListener != null) mListener.onDateSet(mId, view, year, month, dayOfMonth); 
    } 
    public static interface DatePickerDialogListener { 
     public void onDateSet(int id, DatePicker view, int year, int month, int dayOfMonth); 
    } 
} 

其將利用本datepickerdialog片段類藥物有以下代碼:

public class Medication extends Fragment implements DatePickerFragment.DatePickerDialogListener { 
    private static final int FIRST_VISIT_ID = 1; 
    private static final int SECOND_VISIT_ID = 2; 
    private static final int THIRD_VISIT_ID = 3; 
    private int mYear; 
    private int mMonth; 
    private int mDay; 
    protected static TextView date1; 
    protected static TextView date2; 
    protected static TextView date3; 
    public Medication() { 
     // Required empty public constructor 
    } 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_medication, container, false); 
     final Calendar c = Calendar.getInstance(); 
     mYear = c.get(Calendar.YEAR); 
     mMonth = c.get(Calendar.MONTH); 
     mDay = c.get(Calendar.DAY_OF_MONTH); 
     date1 =(TextView) view.findViewById(R.id.visit_date1); 
     date2 =(TextView) view.findViewById(R.id.visit_date2); 
     date3 =(TextView) view.findViewById(R.id.visit_date3); 
     date1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       DialogFragment newFragment = DatePickerFragment.newInstance(FIRST_VISIT_ID); 
       newFragment.show(getFragmentManager(), "timePicker"); 
      } 
     }); 
     date2.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       DialogFragment newFragment = DatePickerFragment.newInstance(SECOND_VISIT_ID); 
       newFragment.show(getFragmentManager(), "timePicker"); 
      } 
     }); 
     date3.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       DialogFragment newFragment = DatePickerFragment.newInstance(THIRD_VISIT_ID); 
       newFragment.show(getFragmentManager(), "timePicker"); 
      } 
     }); 
     date1.setText(
      new StringBuilder() 
      // Month is 0 based so add 1 
      .append(mDay).append("/") 
      .append(mMonth + 1).append("/") 
      .append(mYear).append(" ")); 
     date2.setText(
      new StringBuilder() 
      // Month is 0 based so add 1 
      .append(mDay).append("/") 
      .append(mMonth + 1).append("/") 
      .append(mYear).append(" ")); 
     date3.setText(
      new StringBuilder() 
      // Month is 0 based so add 1 
      .append(mDay).append("/") 
      .append(mMonth + 1).append("/") 
      .append(mYear).append(" ")); 
     return view; 
    } 
    @Override 
    public void onDateSet(int id, DatePicker view, int year, int month, int dayOfMonth) { 
     Log.i("DatePicker", "Date picker set from id " + id + "!"); 
     if(id == FIRST_VISIT_ID) 
     { 
      this.date1.setText(
      new StringBuilder() 
      // Month is 0 based so add 1 
      .append(dayOfMonth).append("/") 
      .append(month + 1).append("/") 
      .append(year).append(" ")); 
     } 
     if(id == SECOND_VISIT_ID) 
     { 
      this.date2.setText(
      new StringBuilder() 
      // Month is 0 based so add 1 
      .append(dayOfMonth).append("/") 
      .append(month + 1).append("/") 
      .append(year).append(" ")); 
     } 
     if(id == THIRD_VISIT_ID) 
     { 
      this.date3.setText(
      new StringBuilder() 
      // Month is 0 based so add 1 
      .append(dayOfMonth).append("/") 
      .append(month + 1).append("/") 
      .append(year).append(" ")); 
     } 
    } 
} 

我曾嘗試添加多個拾取器用於時間選擇器的這個方法對話框,但同樣的問題發生在Medication類中的onTimeSet方法沒有被調用,因爲在這裏onDateSet。

的問題是,該對話框打開,當我點擊一個TextView但之後,我改變日期,該TextView的日期不會改變。此外,日誌信息消息未顯示爲onDateSet方法未被調用。 也許mListener在這種情況下是空的,我只能猜測。 請幫我解決這個問題。提前致謝。

回答

0

嘗試在onDateSet添加片段的一些日誌,看看有什麼值設置那裏,如果它調用的監聽器。

@Override 
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) { 
    Log.i("Fragment/onDateSet", "Date picker set from id " + mId+ "!"); 
    if (mListener != null) 
     mListener.onDateSet(mId, view, year, month, dayOfMonth); 
    else 
     Log.w("Fragment/onDateSet", "But no listener available!");  
} 

並把它放在不同的片段不同的標籤,因爲現在你在同一個標​​籤

newFragment.show(getFragmentManager(), "timePicker2"); 
0

標記他們,我沒有得到答案,爲什麼上面的代碼不起作用但經過網上搜索後,我發現了另一種非常有用的方法,用於在多個TextView中添加日期或時間。在這裏,我在片段中添加了兩個日期,同樣的技術也適用於活動。

public class Medication extends Fragment implements View.OnClickListener{ 

    private DatePickerDialogFragment mDatePickerDialogFragment; 

    protected static TextView date1; 
    protected static TextView date2; 

    @Override 
    public View onCreateView(final LayoutInflater inflater, final ViewGroup  container, 
    Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_medication, container, false); 
    date1 = (TextView) view.findViewById(R.id.date1); 
    date2 = (TextView) view.findViewById(R.id.date2); 

    displayCurrentDate(); // display current date as default in date1 and date2 

    mDatePickerDialogFragment = new DatePickerDialogFragment(); 

    date1.setOnClickListener(this); 
    date2.setOnClickListener(this); 

    } 

    public void displayCurrentDate(){ 

    static Calendar calendar = Calendar.getInstance(); 
    private int year = calendar.get(Calendar.YEAR); // get current year 
    private int month = calendar.get(Calendar.MONTH);// get current month 
    private int day = calendar.get(Calendar.DAY_OF_MONTH); // get current day 

    calendar.set(year, month, day); 
    SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy"); 

    // display Current Date in date1 and date2 

    date1.setText(format.format(calendar.getTime())); 
    date2.setText(format.format(calendar.getTime()));   

    } 

    @Override 
    public void onClick(View v) { 

    int id = v.getId(); 

    if (id == R.id.date1) { 
    mDatePickerDialogFragment.setDateFlag(FLAG_DATE_ONE); 
    mDatePickerDialogFragment.show(getFragmentManager(), "datePicker1"); 
    }else if (id == R.id.date2) { 
    mDatePickerDialogFragment.setDateFlag(FLAG_DATE_TWO); 
    mDatePickerDialogFragment.show(getFragmentManager(), "datePicker2"); 
    } 
    } 

    public static class DatePickerDialogFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener { 
    protected static final int FLAG_DATE_ONE = 1; 
    protected static final int FLAG_DATE_TWO = 2; 
    private int flag = 0; 
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     Calendar calendar = Calendar.getInstance(); 
     int year = calendar.get(Calendar.YEAR); 
     int month = calendar.get(Calendar.MONTH); 
     int day = calendar.get(Calendar.DAY_OF_MONTH); 

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

    public void setDateFlag(int i) { 
     flag = i; 
    } 

    @Override 
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { 
     Calendar calendar = Calendar.getInstance(); 
     calendar.set(year, monthOfYear, dayOfMonth); 
     SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy"); 
     if (flag == FLAG_DATE_ONE) { 
      date1.setText(format.format(calendar.getTime())); 
     } else if (flag == FLAG_DATE_TWO) { 
      date2.setText(format.format(calendar.getTime())); 
     } 
    } 
} 

} 

注:請添加機器人:可點擊=「真」爲使點擊操作的XML佈局每個TextView的,否則TextView的用戶將無法點擊。

我希望這會幫助別人:)