代码之家  ›  专栏  ›  技术社区  ›  Axbor Axrorov

字段重写或构造函数参数哪个更好

  •  0
  • Axbor Axrorov  · 技术社区  · 6 年前

    哪个基片段更喜欢使用,为什么? 在此实现中,布局是抽象字段。

    abstract class BaseFragment1 : Fragment() {
    
        abstract val layoutRes: Int
    
        override fun onCreateView(inflater: LayoutInflater, 
                                  container: ViewGroup?, 
                                  savedInstanceState: Bundle?
                ): View {
            return inflater.inflate(layoutRes, container, false)
        }
    }
    

    在这个实现中,布局是通过构造函数传递的

    abstract class BaseFragment2(@LayoutRes private val layoutRes: Int) : Fragment() {
    
        override fun onCreateView(inflater: LayoutInflater, 
                                  container: ViewGroup?, 
                                  savedInstanceState: Bundle?
            ): View {
                return inflater.inflate(layoutRes, container, false)
         }
    }
    

    我想知道哪个实现更好地使用?如果你有其他的解决方案,你可以分享它。 实施示例:

    class FramgnetA : BaseFragment1() {
        override val layuotRes = R.layout.layout
    }
    
    class FragmentB : BaseFragment2(R.layout.layout)
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   zapl    6 年前

    像在 Best practice for instantiating a new Android Fragment -对于可以从外部提供的参数,可以使用 Bundle Fragment#setArguments(Bundle)

    例如。

    class DynamicContentFragment : Fragment() {
        companion object {
            private const val KEY_LAYOUT_ID = "layoutId"
            fun instance(@LayoutRes layoutRes: Int) =
                    DynamicContentFragment().apply {
                        arguments = Bundle().apply { putInt(KEY_LAYOUT_ID, layoutRes) }
                    }
        }
    
        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
            val layout = arguments!!.getInt(KEY_LAYOUT_ID)!!
            return inflater.inflate(layout, container, false)
        }
    }
    
    class UseCase {
        fun test(fm: FragmentManager) {
            fm.beginTransaction()
                    .replace(R.id.container, DynamicContentFragment.instance(R.layout.main))
        }
    }
    

    否则,您的解决方案是可以的,但它需要每个参数一个新的类。用科特林写作的课程很便宜,所以我想这是首选。