Android 即使AppObject不为null,appPackageName仍返回null
我是一个全新的应用程序开发人员,使用Kotlin创建一个启动器应用程序。我正在运行以下代码,以便从我制作的应用程序抽屉启动应用程序: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
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)