1

我有一个片段,我想将其用作全屏或对话框内容。

我试图通过这种方式:

companion object {
    val DIALOG_TITLE = "DIALOG_TITLE"
    fun getInstance(title: String, content: Fragment): BaseCustomDialogFragment {
        return BaseCustomDialogFragment().apply {
            arguments?.putString(DIALOG_TITLE, title)
            activity?.fragmentAdd(content)
        }
    }
}

显然,这个解决方案是行不通的。只要没有附加 Fragment,我们就无法访问该活动。

有什么方法可以在不触发 Activity 负载的情况下实现相同的结果?

4

1 回答 1

0

我找到了解决方法。我们没有传递 Fragment,而是包含 Fragment 的类和参数(Class<T>Bundle)。然后,我们创建并添加片段onViewCreated()

这是代码:

class BaseCustomDialogFragment: Fragment() {

companion object {
    val FRAGMENT_CLASS = "FRAGMENT_CLASS"
    val ARGUMENTS_BUNDLE = "ARGUMENTS_BUNDLE"
    fun <T> getInstance(title: String, fragmentClass: Class<T>, bundle: Bundle): BaseCustomDialogFragment {
        return BaseCustomDialogFragment().apply {
            arguments = Bundle()
            arguments!!.putString(DIALOG_TITLE, title)
            arguments!!.putSerializable(FRAGMENT_CLASS, fragmentClass)
            arguments!!.putBundle(ARGUMENTS_BUNDLE, bundle)
        }
    }
}

private lateinit var className: Class<*>
private lateinit var bundle: Bundle

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    (arguments?.getSerializable(FRAGMENT_CLASS) as? Class<*>)?.let { className = it }
    arguments?.getBundle(ARGUMENTS_BUNDLE)?.let { bundle = it }

    // Inflate View.
    return inflater.inflate(R.layout.fragment_custom_dialog, container, false)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    setContentUp()
}

private fun setContentUp(){
    val fragment = createFragment(className, bundle)

    activity?.supportFragmentManager
            ?.beginTransaction()
            ?.add(R.id.fragment_dialog_placeholder, fragment)
            ?.disallowAddToBackStack()
            ?.commit()
}

private fun <T> createFragment(fragmentClass: Class<T>, arguments: Bundle): Fragment {
    val fragment = fragmentClass.newInstance() as Fragment
    fragment.arguments = arguments
    return fragment
}

我希望它对某人有所帮助。

于 2018-08-17T13:15:47.603 回答