【问题标题】:Calling setTitle() on a DialogFragment from a ListFragment从 ListFragment 调用 DialogFragment 上的 setTitle()
【发布时间】:2012-11-17 05:36:10
【问题描述】:

我正在尝试从扩展 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 returns null

关于如何解决这个问题的任何想法?

【问题讨论】:

    标签: android android-fragments android-listfragment android-dialogfragment


    【解决方案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 通过setArguments()getArguments() 接收参数的能力方法。这允许您保留默认的空构造函数,以便框架可以正确实例化您的片段(例如,如果您通过 XML 引入片段)。一个例子可以是found here

    来自documentation

    每个片段都必须有一个空的构造函数,所以它可以是 在恢复其活动状态时实例化。它是强烈的 建议子类不要有其他构造函数 参数,因为这些构造函数不会被调用时 片段被重新实例化;相反,参数可以由 调用者使用 setArguments(Bundle) 并稍后由 带有 getArguments() 的片段。

    【讨论】:

    • 谢谢!通过 RatingDialogFragment 构造函数传递字符串,然后在 RatingDialogFragment 的 onCreateDialog 中调用 setTitle 就可以了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多