Android 即使AppObject不为null,appPackageName仍返回null

Android 即使AppObject不为null,appPackageName仍返回null,android,kotlin,nullpointerexception,android-adapter,package-name,Android,Kotlin,Nullpointerexception,Android Adapter,Package Name,我是一个全新的应用程序开发人员,使用Kotlin创建一个启动器应用程序。我正在运行以下代码,以便从我制作的应用程序抽屉启动应用程序: class AppAdapter(context:Context, appList:List<AppObject>):BaseAdapter() { private val context:Context private val appList:List<AppObject> private val inflater: LayoutInfl

我是一个全新的应用程序开发人员,使用Kotlin创建一个启动器应用程序。我正在运行以下代码,以便从我制作的应用程序抽屉启动应用程序:

class AppAdapter(context:Context, appList:List<AppObject>):BaseAdapter() {
private val context:Context
private val appList:List<AppObject>
private val inflater: LayoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
init{
    this.context = context
    this.appList = appList
}

override fun getCount(): Int {
    return appList.size
}

override fun getItem(position:Int): Any {
    return appList[position]
}

override fun getItemId(position:Int):Long {
    return position.toLong()
}

override fun getView(position:Int, convertView:View?, parent:ViewGroup):View
{
    val v:View
    if (convertView == null)
    {
        v = inflater.inflate(R.layout.item_app, parent, false)
    }
    else
    {
        v = convertView
    }

    val myLayoutView = v.findViewById(R.id.layout) as LinearLayout
    val myImageView = v.findViewById(R.id.image) as ImageView
    val myLabelView =v.findViewById(R.id.label) as TextView

    val app = getItem(position) as AppObject
    myLabelView.text = app.appName
    myImageView.setImageDrawable(app.appImage)

    myLayoutView.setOnClickListener(object : View.OnClickListener {
        override fun onClick(v: View) {
            println(app)
            val applicationPackageName: String? = app.appPackageName
            if (applicationPackageName != null) {
                val launchAppIntent = context.packageManager.getLaunchIntentForPackage(app.appPackageName)
                if (launchAppIntent != null) {
                    context.startActivity(launchAppIntent)
                }
            }
        }
    })
    return v
}
}

特别注意

println(app)
在我的AppAdapter类中,当我用此语句单击抽屉中的应用程序布局时,获取结果没有问题。例如,以下是我单击三个不同应用程序时的跑步结果:

I/System.out:com.example.gotime\u AparentalControl和ProductivityApp。AppObject@84ad308I/System.out:com.example.gotime\u AparentalControl和ProductivityApp。AppObject@4587aa1I/System.out:com.example.gotime\u AparentalControl和ProductivityApp。AppObject@88f74c6

但当我更改print语句以包含包名时:

println(app.appPackageName)
我只得到:
I/System.out:null I/System.out:null I/System.out:null

我做错了什么

我觉得这不应该受到责备,但我想指出,我遇到了一个模拟器错误:
Emulator:Emulator:INFO:QtLogger.cpp:68:Critical:Uncaught-TypeError:无法读取未定义的属性“update”
不时地我已经冷启动了我的AVD(Nexus 5X API 29)


非常感谢您的帮助或建议。谢谢大家!

问题:1。什么是
AppObject
?那是你创建的对象吗?2.您确定只有
appPackageName
不为空吗?可能是获取appPackageName的逻辑导致了这个问题。您好,谢谢@Sylwek。下面是AppObject:
class AppObject(packageName:String?,name:CharSequence,image:Drawable){val-appName:CharSequence val-appPackageName:String?var-appImage:Drawable init{this.appName=name this.appPackageName=packageName this.appImage=image}
看看这个,您的
packageName
似乎可以为空。而且可能有一些铸造的问题。可以尝试设置默认值=“”,也可能考虑使用数据类。代码>数据类AppObject(val-packageName:String=“”,val-name:CharSequence,val-image:Drawable)这样就不需要构造函数了。@Sylwek Ok,我正在尝试,但无法通过设置映像。我不知道如何初始化图像,也没有在线资源能够向我展示
数据类AppObject(val-packageName:String,val-name:CharSequence,val-image:Drawable){val-appName:CharSequence=”“val-appPackageName:String=”“val-image:Drawable=??}
将默认值设置为drawable可能非常棘手,因为它包含资源。如果希望它不为空,则不需要设置默认值,只需在创建对象时设置
image
。kotlin中的数据类根本不需要body,所以您可以像这样使用它。val t=AppObject(“test”、“test1”、resources.getDrawable(R.drawable.id))。若你们看一下我上面的例子,你们会发现我在构造函数中设置了默认值。
println(app.appPackageName)