2

ListFragment を拡張する Fragment の onActivityCreated メソッドから DialogFragment のタイトルを設定しようとしています。

public void onActivityCreated(Bundle savedState) {
    super.onActivityCreated(savedState);
    ListView lv = this.getListView();
    lv.setOnItemLongClickListener(new OnItemLongClickListener() {

        public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                int pos, long id) {

            android.app.FragmentManager fragmentManager = getFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager
                    .beginTransaction();
            RatingDialogFragment newFragment = new RatingDialogFragment();
            newFragment.getDialog().setTitle("String");
            fragmentTransaction.add(newFragment, "dialog");
            newFragment.show(fragmentTransaction, "dialog");

            return true;
        }
    });
}

これにより、DialogFragment の mDialog がまだ null であるため、null ポインタ例外が発生します。

参照: DialogFragment.getDialog が null を返す

これを修正する方法についてのアイデアはありますか?

4

1 に答える 1

8

これを修正する 1 つの可能な方法は、Fragmentそのタイトルを安全に設定できるようになる時期を作成者に決定させることです。

たとえば、コンストラクターでタイトルを渡し、それをメンバー変数に保持できます。

RatingDialogFragment newFragment = new RatingDialogFragment("String");

次に、RatingDialogFragment で:

...
public RatingDialogFragment(String title) {
   mTitle = title;
}
...

RatingDialogFragment ライフサイクルのどこかで、安全に実行できる場合は、実際にタイトルを設定します。

...
@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Set title for this dialog
        getDialog().setTitle(mTitle);
    }

編集:これはこの特定のケースで機能しますが、より良い一般的なアプローチは、およびメソッドFragmentを介して引数を受け取る の機能を使用することです。これにより、デフォルトの空のコンストラクターをそこに保持できるため、フラグメントがフレームワークによって正しくインスタンス化されます (たとえば、フラグメントを XML 経由で導入した場合)。例はここにありますsetArguments()getArguments()

ドキュメントから:

すべてのフラグメントには空のコンストラクターが必要であるため、アクティビティの状態を復元するときにインスタンス化できます。フラグメントが再インスタンス化されるときにこれらのコンストラクターが呼び出されないため、サブクラスにパラメーターを持つ他のコンストラクターを持たないことを強くお勧めします。代わりに、呼び出し元が setArguments(Bundle) を使用して引数を指定し、後で Fragment が getArguments() を使用して取得できます。

于 2012-11-17T05:51:40.307 に答える