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 仍然为空。

请参阅:DialogFragment.getDialog 返回 null

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

4

1 回答 1

8

解决此问题的一种可能方法是让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);
    }

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

文档中:

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

于 2012-11-17T05:51:40.307 回答