Котлин Один И Тот Же Фрагмент Нескольких Действий

#android #kotlin #android-activity #navigation #fragment

Вопрос:

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

Разбивка нового фрагмента.кт

 class BreakingNewsFragment : Fragment(R.layout.fragment_breaking_news) {

    lateinit var viewModel: NewsViewModel
    lateinit var viewModel2:NewsViewModel
    lateinit var newsAdapter: NewsAdapter

    val TAG = "BreakingNewsFragment"

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        viewModel = (activity as NewsActivity).viewModel
        viewModel2=(activity as UsNewsActivity).viewModel

        setupRecyclerView()

        newsAdapter.setOnItemClickListener {
            val bundle = Bundle().apply {
                putSerializable("article", it)
            }
            findNavController().navigate(
                R.id.action_breakingNewsFragment_to_articleFragment,
                bundle
            )
        }

        viewModel.breakingNews.observe(viewLifecycleOwner, Observer { response ->
            when(response) {
                is Resource.Success -> {
                    hideProgressBar()
                    response.data?.let { newsResponse ->
                        newsAdapter.differ.submitList(newsResponse.articles.toList())
                        val totalPages=newsResponse.totalResults/ QUERY_PAGE_SIZE 2 //Sayfada boşluk oluşuyor
                        isLastPage=viewModel.breakingNewsPage==totalPages
                        if(isLastPage){
                            rvBreakingNews.setPadding(0,0,0,0)
                        }
                    }
                }
                is Resource.Error -> {
                    hideProgressBar()
                    response.message?.let { message ->
                        Log.e(TAG, "An error occured: $message")
                    }
                }
                is Resource.Loading -> {
                    showProgressBar()
                }
            }
        })

    }
 

Ошибка

Вызвано: java.lang.ClassCastException: com.androiddevs.mvvmnewsapp.ui.Новостная активность не может быть передана в com.androiddevs.mvvmnewsapp.ui.UsNewsActivity в com.androiddevs.mvvmnewsapp.ui.фрагменты.BreakingNewsFragment.onviewсоздан(BreakingNewsFragment.kt:34)

Ответ №1:

Я полагаю, вы получаете это при создании своего фрагмента из a NewsActivity ? Вы пытаетесь относиться к а UsNewsActivity как NewsActivity к а, которым оно не является.

просто иди:

 val viewModel: NewsViewModel by activityViewModels()
 

как и предлагалось здесь. Это должно дать вам ViewModel то, что используется в Activity .

Если вы хотите придерживаться того, как вы делаете это сейчас, вы можете либо внедрить interface в свою деятельность такие

 interface NewsActivityInterface {
    val viewModel: NewsViewModel
}
class MainActivity : AppCompatActivity(), NewsActivityInterface {
    override val viewModel: NewsViewModel by viewModels()
    (...)
}
 

а затем получите свою модель представления, такую как

 viewModel = (activity as NewsActivityInterface).viewModel
 

или проверьте тип:

 val viewModel = activity.let{
    when (it){
        is MainActivity -> it.viewModel
        is AnotherActivity -> it.viewModel
        else -> error ("Needs correct activity")
    }
}
 

Комментарии:

1. Спасибо, сэр. Я попробовал ваш последний вариант, и он оказался успешным.