2015-10-15 90 views
5

我在我的应用程序中有4 timePicker。当用户双击editText时,弹出对话框timePicker。但有时当我不小心点击两次以上时,应用程序崩溃,并说已添加片段。我怎样才能解决这个问题?由于点击了editText两次,我只需点击editText即可显示timePicker对话框。如何添加timePicker使用片段?

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的错误

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) 

回答

2

您的代码太硬编码,不易扩展,这可能会导致将来出现很多错误。 您应该封装一般的逻辑为max就可以了,所以在目前的情况下:

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

这个代码将不会尝试创建新的时间选择,如果任何在屏幕上。您可以将目标编辑文本传递给timePicker片段。当您需要这些edittext(您的a,b,c,d ...变量)的值时,您可以在需要时读取它,而不是在onTimeSetMethod中。

提供了onStop方法来处理活动娱乐情况。在这里,我只隐藏活动的时间选择器。

+0

嗨Beloo,感谢您花时间解决我的问题。我如何将其他变量传递给timePicker片段? – John

+0

你可以通过contstructor,setter来做到这一点。确保你真的需要它。如果你描述了你需要什么,我可以更详细地 – Beloo

+0

你可以看到右侧的图像http://i.stack.imgur.com/45hI5.png – John

1

您添加相同DialogFragment实例两次,以解决这个问题,检查TimePicker是否加入getFragmentManager.findFragmentByTag("TimePicker")

+0

我在哪里可以检查? – John

+0

每次调用'tp.show(ft,“TimePicker”)'时,都会添加'DialogFragment',从而导致异常。在调用之前检查它,或者每次从关闭DialogFragment时删除一个新实例。 – Neil

+0

IMO它对你来说使用对话框的新实例是很好的,你不必实现大量的样板代码来重置状态和数据结构,并且,作为你的考虑之一,轻量级对话对它的影响很小内存分配。 – Neil