【问题标题】:Kotlin Same Fragment Multiple ActivitiesKotlin 相同片段多个活动
【发布时间】: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)

【问题讨论】:

    标签: android kotlin android-activity navigation fragment


    【解决方案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")
        }
    }
    

    【讨论】:

    • 谢谢先生。我尝试了你的最后一个选项,它成功了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    相关资源
    最近更新 更多