【问题标题】:DialogFragment behaving unexpectedlyDialogFragment 行为异常
【发布时间】:2013-02-23 19:39:44
【问题描述】:

您好,我已使用此 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,它确认它需要类是静态的。但是为什么它允许我使用它,即使我在清理项目时没有给出静态。这发生在最近之前它没有显示任何这样的错误。当我与团队成员共享项目时,同样没有显示任何错误。为什么会这样..

【问题讨论】:

  • 您的DialogFragment 是内部(嵌套)类吗?
  • @Eric 是的,它是扩展 FragmentActivity 的类中的内部类

标签: java android dialog


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

  • @Eric 很好的解释和很好的例子......我在以前的应用程序中使用过这个。我没有方向问题,因为我在应用程序级别设置了固定方向。以前的应用程序已经发布。它会对我以前的应用程序造成任何问题吗?像应用程序崩溃?
  • 如果您没有处理方向更改,那么它可能会崩溃。如果我是你,我会拿起一个设备并测试你的旧应用程序以确定确定。 (您可能以 Android 从未接触过的方式处理了创建。)
  • 我当然会这样做...抱歉打扰您..但是为什么我清理项目时没有显示错误?
  • 我真的不知道他们为什么会消失,他们绝对不应该。如果您再次run the Lint check,它们可能会再次出现。
猜你喜欢
  • 2017-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-05
  • 2017-01-22
  • 2013-04-14
  • 2014-01-29
相关资源
最近更新 更多