Переопределение поля или параметр конструктора, который лучше - PullRequest
0 голосов
/ 25 сентября 2018

Какой базовый фрагмент предпочитаете использовать и почему?В этой реализации layoutRes является абстрактным полем.

abstract class BaseFragment1 : Fragment() {

    abstract val layoutRes: Int

    override fun onCreateView(inflater: LayoutInflater, 
                              container: ViewGroup?, 
                              savedInstanceState: Bundle?
            ): View {
        return inflater.inflate(layoutRes, container, false)
    }
}

И в этой реализации layoutRes проходит через конструктор

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 Ответ

0 голосов
/ 25 сентября 2018

Как и в Лучшая практика для создания нового фрагмента Android - для параметров, которые могут быть предоставлены извне, вы можете использовать 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))
    }
}

В противном случае ваши решения хороши, но для каждого параметра требуется новый класс.Классы дешевы, чтобы писать на котлине, так что, я думаю, это предпочтение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...