2

嗨,我已使用此 DialogFragment 在我的应用程序中显示日期选择器

public class DateDialogFragment extends DialogFragment  implements DatePickerDialog.OnDateSetListener{

        public DateDialogFragment()
        {
        }
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            Calendar cal=Calendar.getInstance();
            int year=cal.get(Calendar.YEAR);
            int month=cal.get(Calendar.MONTH);
            int day=cal.get(Calendar.DAY_OF_MONTH);
            return new DatePickerDialog(getActivity(), this, year, month, day);
        }
        public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
            showSetDate(year,monthOfYear,dayOfMonth);
        }

        }

    public void showSetDate(int year,int month,int day) {
    text.setText(year+"/+"+month+"/"+day);
    }

如果在我以前的应用程序中使用过相同的。最近它 DateDialogFragment 表现得很奇怪。在 Eclipse 中,它显示错误 DateDialogFragment 应该是静态的。但是当我清理项目一次时。它在项目中没有显示任何错误,并且运行良好。我已经浏览了这个DialogFragment,它确认它需要类是静态的。但是为什么它允许我使用它,即使我在清理项目时没有给出静态。这发生在最近之前它没有显示任何这样的错误。当我与团队成员共享项目时,同样没有显示任何错误。为什么会这样。。

4

1 回答 1

3

您看到这个的原因是因为 Android 有时需要自己实例化Fragment它。这适用于任何 Fragment.

当您创建一个static内部类时,这意味着它不依赖于外部类的任何特定实例。所以假设你有:

public class A {
  public static class B {
    // ...
  }
  public class C {
    // ...
  }
}

在这种情况下,您不能new C()从外部进行操作,A因为 的所有实例都C属于一个A对象。但是,您可以new B()执行或new A.B()

这同样适用于片段;new DateDialogFragment()如果类不是静态的,Android 就无法做到。您没有收到错误的原因(尽管 Lint应该告诉您)是因为您正在实例化DateDialogFragment自己。

但是,如果您触发了诸如方向更改之类的操作并且不Fragment手动重新创建,Android 会为您执行此操作。做不到,就会崩溃。

但是,如果类静态的,Android可以创建它的实例。因此,嵌套Fragment类应该始终static.

于 2013-02-23T19:48:26.253 回答