2015-10-15 16 views
5

Tôi có 4 timePicker trong ứng dụng của mình. Hộp thoại timePicker sẽ bật ra khi người dùng nhấp đúp vào editText. Nhưng đôi khi tôi vô tình bấm nhiều hơn hai lần, ứng dụng bị lỗi và nói rằng đoạn đã được thêm vào. Làm thế nào tôi có thể sửa lỗi này? Được kích hoạt bằng cách nhấp vào editText hai lần, tôi muốn hộp thoại timePicker hiển thị chỉ bằng một cú nhấp chuột trên editText.Cách thêm timePicker bằng phân đoạn?

public void onClick(View v) { 
     int id = v.getId(); 
     if (id == R.id.editTextTI1) { 
      tp.setFlag(TimePick.FLAG_START_DATE); 
      FragmentTransaction ft = getFragmentManager().beginTransaction(); 
      tp.show(ft, "TimePicker"); 
     } 
     if (id == R.id.editTextTO1) { 
      tp.setFlag(TimePick.FLAG_END_DATE); 
      FragmentTransaction ft = getFragmentManager().beginTransaction(); 
      tp.show(ft, "TimePicker"); 
     } 
     if (id == R.id.editTextTI2) { 
      tp.setFlag(TimePick.FLAG_START_DATE1); 
      FragmentTransaction ft = getFragmentManager().beginTransaction(); 
      tp.show(ft, "TimePicker"); 
     } 
     if (id == R.id.editTextTO2) { 
      tp.setFlag(TimePick.FLAG_END_DATE1); 
      FragmentTransaction ft = getFragmentManager().beginTransaction(); 
      tp.show(ft, "TimePicker"); 
     } 
     if (id == R.id.editTextTI3) { 
      tp.setFlag(TimePick.FLAG_START_DATE2); 
      FragmentTransaction ft = getFragmentManager().beginTransaction(); 
      tp.show(ft, "TimePicker"); 
     } 
     if (id == R.id.editTextTO3) { 
      tp.setFlag(TimePick.FLAG_END_DATE2); 
      FragmentTransaction ft = getFragmentManager().beginTransaction(); 
      tp.show(ft, "TimePicker"); 
     } 
     if (id == R.id.editTextTI4) { 
      tp.setFlag(TimePick.FLAG_START_DATE3); 
      FragmentTransaction ft = getFragmentManager().beginTransaction(); 
      tp.show(ft, "TimePicker"); 
     } 
     if (id == R.id.editTextTO4) { 
      tp.setFlag(TimePick.FLAG_END_DATE3); 
      FragmentTransaction ft = getFragmentManager().beginTransaction(); 
      tp.show(ft, "TimePicker"); 
     } 

    } 




    public static class TimePick extends android.app.DialogFragment implements TimePickerDialog.OnTimeSetListener { 

     public static final int FLAG_START_DATE = 00; 
     public static final int FLAG_END_DATE = 01; 
     public static final int FLAG_START_DATE1 = 10; 
     public static final int FLAG_END_DATE1 = 11; 
     public static final int FLAG_START_DATE2 = 20; 
     public static final int FLAG_END_DATE2 = 21; 
     public static final int FLAG_START_DATE3 = 30; 
     public static final int FLAG_END_DATE3 = 31; 
     private int flag = 00; 

     @Override 
     public Dialog onCreateDialog(Bundle savedInstanceState) { 

      final Calendar c = Calendar.getInstance(); 
      int hour = c.get(Calendar.HOUR_OF_DAY); 
      int minute = c.get(Calendar.MINUTE); 

      return new TimePickerDialog(getActivity(), this, hour, minute, DateFormat.is24HourFormat(getActivity())); 
     } 

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

     @Override 
     public void onTimeSet(TimePicker view, int hourofDay, int minute) { 

      if (flag == FLAG_START_DATE) { 
       start.setText(Integer.toString(hourofDay) + ":" + Integer.toString(minute)); 
       b = start.getText().toString(); 
      } 
      if (flag == FLAG_END_DATE) { 
       end.setText(Integer.toString(hourofDay) + ":" + Integer.toString(minute)); 
       c = end.getText().toString(); 
      } 
      if (flag == FLAG_START_DATE1) { 
       start1.setText(Integer.toString(hourofDay) + ":" + Integer.toString(minute)); 
       d = start1.getText().toString(); 
      } 
      if (flag == FLAG_END_DATE1) { 
       end1.setText(Integer.toString(hourofDay) + ":" + Integer.toString(minute)); 
       e1 = end1.getText().toString(); 
      } 
      if (flag == FLAG_START_DATE2) { 
       start2.setText(Integer.toString(hourofDay) + ":" + Integer.toString(minute)); 
       f = start2.getText().toString(); 
      } 
      if (flag == FLAG_END_DATE2) { 
       end2.setText(Integer.toString(hourofDay) + ":" + Integer.toString(minute)); 
       g = end2.getText().toString(); 
      } 
      if (flag == FLAG_START_DATE3) { 
       start3.setText(Integer.toString(hourofDay) + ":" + Integer.toString(minute)); 
       h = start3.getText().toString(); 
      } 
      if (flag == FLAG_END_DATE3) { 
       end3.setText(Integer.toString(hourofDay) + ":" + Integer.toString(minute)); 
       i = end3.getText().toString(); 
      } 

LogCat Lỗi

10-15 12:53:17.113 7943-7943/com.example.project.project E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.example.project.project, PID: 7943 
    java.lang.IllegalStateException: Fragment already added: TimePick{7c7eb96 #0 TimePicker} 
      at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1219) 
      at android.app.BackStackRecord.run(BackStackRecord.java:715) 
      at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1535) 
      at android.app.FragmentManagerImpl$1.run(FragmentManager.java:482) 
      at android.os.Handler.handleCallback(Handler.java:739) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:148) 

Trả lời

2

Mã của bạn quá cứng và không dễ mở rộng, có thể dẫn đến nhiều lỗi trong tương lai. Bạn nên đóng gói logic chung như max như bạn có thể, vì vậy trong trường hợp hiện tại:

public void onClick(View v) { 
    EditText editText = (EditText) v; 
    if (tp==null || !tp.isAdded()){ 
     FragmentTransaction ft = getFragmentManager().beginTransaction(); 
     tp = new TimePick(editText); 
     tp.show(ft, "TimePicker"); 
    } 
} 

@Override 
public void onStop() { 
    super.onStop(); 
    if (tp.isAdded()) tp.dismiss(); 
} 

public static class TimePick extends android.app.DialogFragment implements TimePickerDialog.OnTimeSetListener { 

    private EditText editText; 

    public TimePick(EditText editText) { 
     this.editText = editText; 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 

     final Calendar c = Calendar.getInstance(); 
     int hour = c.get(Calendar.HOUR_OF_DAY); 
     int minute = c.get(Calendar.MINUTE); 

     return new TimePickerDialog(getActivity(), this, hour, minute, DateFormat.is24HourFormat(getActivity())); 
    } 

    @Override 
    public void onTimeSet(TimePicker view, int hourofDay, int minute) { 
     editText.setText(Integer.toString(hourofDay) + ":" + Integer.toString(minute)); 
    } 
} 

mã này sẽ không cố gắng để tạo ra bảng chọn thời gian mới nếu bất kỳ trên màn hình. Bạn có thể chuyển edittext đích vào đoạn timePicker. Khi bạn cần các giá trị từ các edittexts này (các biến a, b, c, d ...) của bạn, bạn có thể đọc nó khi cần thiết, không phải trong onTimeSetMethod.

phương pháp onStop được cung cấp để xử lý các trường hợp giải trí hoạt động. Ở đây tôi chỉ ẩn timepicker hoạt động.

+0

Xin chào Beloo, cảm ơn bạn đã dành thời gian giải quyết vấn đề của mình. Làm thế nào tôi có thể vượt qua các biến khác để đoạn timePicker? – John

+0

Bạn có thể làm điều đó thông qua contstructor, setter. Hãy chắc chắn rằng bạn thực sự cần nó. Nếu bạn mô tả cho những gì bạn cần chúng tôi có thể được chi tiết hơn – Beloo

+0

u có thể nhìn thấy hình ảnh ở phía bên tay phải http://i.stack.imgur.com/45hI5.png – John

1

Bạn đang thêm cùng DialogFragment dụ hai lần, để sửa lỗi này, kiểm tra xem TimePicker được thêm vào với getFragmentManager.findFragmentByTag("TimePicker").

+0

Tôi có thể kiểm tra ở đâu? – John

+0

Mỗi khi bạn gọi 'tp.show (ft," TimePicker ")', 'DialogFragment' được thêm vào, ngoại lệ. Kiểm tra nó trước khi cuộc gọi hoặc bạn có thể sử dụng một trường hợp mới mỗi lần kể từ khi 'DialogFragment' được loại bỏ khi bỏ qua. – Neil

+0

IMO tốt cho bạn khi sử dụng hộp thoại mới, bạn không phải triển khai nhiều mã mẫu soạn sẵn để đặt lại trạng thái và cấu trúc dữ liệu, và, như một trong những cân nhắc của bạn, hộp thoại nhẹ có tác động rất ít cấp phát bộ nhớ. – Neil

Các vấn đề liên quan