#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. Спасибо, сэр. Я попробовал ваш последний вариант, и он оказался успешным.