如何减少Dialog创建与使用的样板代码?避免类名重复冗余
如何减少DialogFragment创建与使用时的样板代码
在使用DialogFragment时,最简单的场景下类名都会重复出现4次(定义TAG、实例化、传入TAG),还要手动维护TAG字段,样板代码冗余又麻烦。比如下面的写法:
class MyDialogFragment : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { // 业务逻辑实现 ... } companion object { const val TAG = "MyDialogFragment" } } class MyFragment : Fragment() { fun doSthAndShowDialog() { sth() MyDialogFragment().show( childFragmentManager, MyDialogFragment.TAG ) } }
我们可以封装一个工具类,自动通过DialogFragment的KClass生成TAG(比如直接用类的简单名称或者全限定名),同时把实例化和显示的逻辑统一处理,彻底消除重复代码和手动维护TAG的麻烦。
实现MagicDialogTool工具类
object MagicDialogTool { // 基础无参版本 fun <T : DialogFragment> show(dialogClass: KClass<T>, fragmentManager: FragmentManager) { // 用类的简单名称作为TAG,同名类场景下可改用全限定类名:dialogClass.java.name val tag = dialogClass.simpleName ?: dialogClass.java.name val dialog = dialogClass.java.newInstance() dialog.show(fragmentManager, tag) } // 支持传递参数的重载版本(遵循官方Bundle传参推荐) fun <T : DialogFragment> show(dialogClass: KClass<T>, fragmentManager: FragmentManager, args: Bundle.() -> Unit) { val tag = dialogClass.simpleName ?: dialogClass.java.name val dialog = dialogClass.java.newInstance().apply { arguments = Bundle().apply(args) } dialog.show(fragmentManager, tag) } }
简化后的使用方式
class MyFragment : Fragment() { fun doSthAndShowDialog() { sth() MagicDialogTool.show( MyDialogFragment::class, childFragmentManager // TAG由工具类内部自动生成,无需手动传入 ) } // 带参数的调用示例 fun showDialogWithArgs() { MagicDialogTool.show(MyDialogFragment::class, childFragmentManager) { putString("KEY_CONTENT", "这是传递的测试内容") putInt("KEY_COUNT", 100) } } }
补充说明
- TAG默认使用类的简单名称,足够应对绝大多数场景;如果项目中有同名的
DialogFragment类,可以将TAG改为类的全限定名(dialogClass.java.name)来避免冲突。 - 工具类默认使用无参构造实例化
DialogFragment,这符合官方推荐的实例化方式(参数通过Bundle传递);如果特殊场景需要有参构造,可以扩展工具类的重载方法,通过反射处理有参构造逻辑。
内容的提问来源于stack exchange,提问作者Grzegorz Dev
相关产品推荐
相关产品推荐

