Kotlin 相同片段多个活动
Posted
技术标签:
【中文标题】Kotlin 相同片段多个活动【英文标题】:Kotlin Same Fragment Multiple Activities 【发布时间】:2021-08-10 11:13:59 【问题描述】:朋友们,我有一个问题。我可以在活动中使用图像中的片段。但我希望能够在不同的活动中查看这个片段。可能吗?我使用了图像中的结构,但我也在写我收到的错误。如果您能提供帮助,我会很高兴。
BreakingNewsFragment.kt
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.NewsActivity 无法转换为 com.androiddevs.mvvmnewsapp.ui.UsNewsActivity 在 com.androiddevs.mvvmnewsapp.ui.fragments.BreakingNewsFragment.onViewCreated(BreakingNewsFragment.kt:34)
【问题讨论】:
【参考方案1】:我想你在从NewsActivity
创建片段时会得到这个?
您正在尝试将 UsNewsActivity
视为 NewsActivity
,但事实并非如此。
去吧:
val viewModel: NewsViewModel by activityViewModels()
建议here。它应该为您提供Activity
中使用的ViewModel
。
如果你想坚持你现在做事的方式,你可以在你的活动中实现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")
【讨论】:
谢谢先生。我尝试了你的最后一个选项,它成功了。以上是关于Kotlin 相同片段多个活动的主要内容,如果未能解决你的问题,请参考以下文章