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()、外部から実行することはできません。ただし、またはを行うことはできます。ACAnew B()new A.B()

同じことがフラグメントにも当てはまります。new DateDialogFragment()クラスが静的でない場合、Androidは実行できません。エラーが発生しない理由(Lintが教えてくれるはずDateDialogFragmentですが)は、自分自身をインスタンス化しているためです。

ただし、向きの変更などをトリガーし、Fragment手動で再作成しない場合は、Androidが自動的に行います。そうすることができないので、それはクラッシュします。

ただし、クラス静的である場合、Androidはそのインスタンスを作成できます。したがって、ネストされたFragmentクラスは常に。である必要がありますstatic

于 2013-02-23T19:48:26.253 に答える