【问题标题】:Kotlin list all activities at runtimeKotlin 在运行时列出所有活动
【发布时间】:2021-12-27 10:30:34
【问题描述】:

我正在尝试制作一个简单的调试活动,允许我在运行时启动我的项目的任何活动。

截至目前,我已经实现了一个 RecyclerView,它以这种方式从列表中获取数据:

    val activitiesList = ArrayList<Activity>()
    activitiesList.add(FrameHomeActivity())
    activitiesList.add(LeaderHomeActivity())
    activitiesList.add(LoginActivity())
    ...

但这取决于我在添加新活动时必须手动更新此列表。

我已经设法将一个 clickListener 附加到 RecyclerView,以便在触摸项目时每个活动都可以成功启动。

有没有办法“动态”获取项目中的所有活动,这样我就不必每次添加新活动时都更新此代码?

【问题讨论】:

    标签: android kotlin android-activity android-recyclerview


    【解决方案1】:

    您不调用 Activity 的构造函数,而是触发 Intent 。您从PackageManager 获得Activity,然后按名称启动它。

    val activities = packageManager
            .getPackageInfo(packageName, PackageManager.GET_ACTIVITIES).activities
        val nameList= activities.map { it.name }
    

    nameList 这里是List&lt;String&gt;,它将包含您的活动类的完全限定名称。 您可以使用此名称创建一个Intent 以从适配器启动活动。

    fun onClickItem(context:Context, activityName:String){
                try {
                    val c = Class.forName(activityName)
                    val intent = Intent(context, c)
                    context.startActivity(intent)
                } catch (ex: Exception) {
                }
            }
    

    【讨论】:

    • 工作就像一个魅力!非常感谢:)
    【解决方案2】:

    您可以使用此代码获取所有活动的列表

    getActivity()
      .getPackageManager()
      .getPackageInfo(getActivity().getPackageName(), PackageManager.GET_ACTIVITIES)
      .activities
    

    编辑 - 当从 Activity 调用时,getActivity() 可以替换为 this,否则需要从片段 getActivity() 调用时。

    【讨论】:

    • 谢谢,但这会检索 ActivityInfo 的列表。有没有办法从 ActivityInfo 对象中检索 Activity?
    • 从活动信息中,您可以获得有关活动的所有信息,包括可用于启动/列出活动的确切包名称
    • 此外,在您粘贴的代码中,您正在自己创建活动对象,这是错误的,您应该保留一个 Activity.class 列表或启动活动所需的 exat 意图。
    猜你喜欢
    • 1970-01-01
    • 2021-08-10
    • 2020-05-09
    • 2010-12-01
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多