добавление дочернего фрагмента в мой фрагмент нижнего листа в Котлине

avatar
someonetonobody
9 августа 2021 в 02:31
324
1
0

Я пытаюсь повторно использовать уже созданный фрагмент в моем нижнем листе, и для этого я использую приведенный ниже код.

class SummaryBottomSheet: BottomSheetDialogFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        val bundle = Bundle()
        val diskOnly =false;

        val ft: androidx.fragment.app.FragmentTransaction = childFragmentManager.beginTransaction()
        ft.replace(R.id.reader_placeholder, ReaderFragment())
        ReaderFragment().arguments = Bundle().apply {
            bundle.putBoolean("diskonly",false)
        }
        ft.commit()
    }
}

теперь я отправляю аргументы пакетом во фрагмент, который я хочу иметь во фрагменте загрузочного листа. и этот фрагмент также получает аргументы от навигатора navArgs(), но этого не происходит на моем нижнем листе, так как теперь я не перемещаюсь, а использую тот же фрагмент на нижнем листе.

фрагмент, который я повторно использую:

lass ReaderFragment : BaseFragment(R.layout.fragment_reader), PageletActionMediator {

    private val args: ReaderFragmentArgs by navArgs()
    private val viewModel: ReaderViewModel by viewModels()
    private val activityViewModel: MainActivityViewModel by activityViewModels()

    private lateinit var recyclerView: RecyclerView
    private lateinit var viewAdapter: PageletListAdapter
    private lateinit var viewManager: LinearLayoutManager

    override fun onCreate(savedInstanceState: Bundle?) {
        Timber.d("created ")


        val arguments = requireArguments()
        val diskOnly = arguments.getBoolean("diskonly")
        shortAnimationDuration = resources.getInteger(android.R.integer.config_shortAnimTime)
 
if(arguments){
        slug?.let { slug ->
            viewModel.initWithSlug(slug, diskOnly)
            return
        }}
else args?.let{
slug ->
            viewModel.initWithSlug(slug, diskOnly)
            return
}
    }

Мое приложение каждый раз вылетает с ошибкой:

java.lang.IllegalStateException: Fragment ReaderFragment{5b3fc12} (7d5de6e0-3258-468c-8db4-d201b4c3f672) id=0x7f090346} does not have any arguments.
                         E      at androidx.fragment.app.Fragment.requireArguments(Fragment.java:679)
                         E      at com.pratilipi.comics.ui.reader.ReaderFragment.onCreate(ReaderFragment.kt:91)
                         E      at androidx.fragment.app.Fragment.performCreate(Fragment.java:2684)
    ```


Источник

Ответы (1)

avatar
ianhanniballake
9 августа 2021 в 04:33
1

Вы не устанавливаете аргументы для фрагмента, который фактически используете в вызове replace:

// Here you create a fragment add use it in replace()
ft.replace(R.id.reader_placeholder, ReaderFragment())

// Here you create a *second* fragment, set its arguments,
// then do nothing with it.
ReaderFragment().arguments = Bundle().apply {
    bundle.putBoolean("diskonly",false)
}

Вместо этого вам нужно установить свои аргументы для фрагмента, который вы используете с replace:

val fragment = ReaderFragment()
fragment.arguments = Bundle().apply {
    bundle.putBoolean("diskonly",false)
}
ft.replace(R.id.reader_placeholder, fragment)