我正在尝试从扩展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。
请参阅:DialogFragment.getDialog returns null
有关如何解决此问题的任何想法?
答案 0 :(得分: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);
}
编辑:值得注意的是,虽然这适用于这种特殊情况,但更好的一般方法是使用Fragment
通过setArguments()
接收参数的能力和getArguments()
方法。这允许您保留默认的空构造函数,以便框架可以正确地实例化您的片段(例如,如果您通过XML引入了Fragment)。一个例子可以是found here。
每个片段都必须有一个空的构造函数,所以它可以 在恢复其活动状态时实例化。这是强烈的 建议子类没有其他构造函数 参数,因为这些构造函数不会被调用 片段被重新实例化;相反,参数可以由。提供 调用者使用setArguments(Bundle)并稍后检索 使用getArguments()进行分段。