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 相同片段多个活动的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin:在片段内打开新活动

使用 Kotlin 的片段和活动

如何从片段 KOTLIN 中调用意图 [重复]

片段内 Spinner 的 Kotlin 问题

将接口从片段传递到kotlin中的活动

Kotlin:片段内的按钮需要在开始活动之前单击两次。如何一键启动活动?