我试图从扩展listframent的片段的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仍然为空。
参阅:DialogFragment.getDialog returns null
有什么解决办法吗?

最佳答案

解决这个问题的一种可能方法是让正在创建的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通过setArguments()getArguments()方法接收参数的能力。这允许您保留默认的空构造函数,以便框架可以正确地实例化您的片段(例如,如果您是通过xml引入片段的话)。一个例子可以是found here
documentation开始:
每个片段都必须有一个空构造函数,因此它可以是
在还原其活动状态时实例化。它是强烈的
建议子类没有其他构造函数
参数,因为当
片段被重新实例化;相反,参数可以由
具有setArguments(bundle)的调用方,稍后由
带有getArguments()的片段。

08-15 21:31