DialogFragment意外行为

时间:2013-02-23 19:39:45

标签: java android dialog

您好我已经使用此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应该是static.But当我清理项目一次。它没有在项目中显示任何错误,并且运行完美。我已经完成了这个DialogFragment,它确认它需要类是静态的。但是为什么它允许我使用这个事件,尽管我在清理项目时没有给静态。最近发生这种情况之前它没有显示任何这样的错误。当我与团队成员共享项目时,同样没有显示任何错误。为什么它会像这样......

1 个答案:

答案 0 :(得分: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()

这同样适用于片段;如果类不是静态的,则Android无法执行new DateDialogFragment()。你没有收到错误的原因(虽然Lint 告诉你)是因为你自己实例化了DateDialogFragment

但是,如果您触发方向更改等内容并且未手动重新创建Fragment,则Android会为您执行此操作。由于无法这样做,它会崩溃。

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