从ListFragment调用DialogFragment上的setTitle()

eds*_*dst 2 android android-fragments android-dialogfragment android-listfragment

我试图从扩展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;
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

这会产生空指针异常,因为DialogFragment的mDialog仍然为null.

请参阅:DialogFragment.getDialog返回null

有想法该怎么解决这个吗?

J. *_*vea 8

解决此问题的一种可能方法是让Fragment创建者确定何时可以安全地设置其标题.

例如,您可以在构造函数中传递标题并将其保存在成员变量中.

RatingDialogFragment newFragment = new RatingDialogFragment("String");
Run Code Online (Sandbox Code Playgroud)

然后在您的RatingDialogFragment中:

...
public RatingDialogFragment(String title) {
   mTitle = title;
}
...
Run Code Online (Sandbox Code Playgroud)

在您的RatingDialogFragment生命周期的某个地方,当它可以安全地执行此操作时,实际设置标题.

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

编辑:值得注意的是,虽然这适用于这种特殊情况,但更好的一般方法是使用Fragment通过setArguments()getArguments()方法接收参数的能力.这允许您保留默认的空构造函数,以便框架可以正确地实例化您的片段(例如,如果您通过XML引入了Fragment).这里可以找到一个例子.

文档:

每个片段都必须有一个空构造函数,因此可以在恢复其活动状态时进行实例化.强烈建议子类没有带参数的其他构造函数,因为在重新实例化片段时不会调用这些构造函数.相反,参数可以由调用者使用setArguments(Bundle)提供,稍后由Fragment使用getArguments()检索.