#android #kotlin #intellij-idea #type-mismatch
#Android #kotlin #intellij-идея #несоответствие типа
Вопрос:
Я создаю приложение для запуска Android с помощью Kotlin и запускаю следующий код для активации приложения. У меня есть панель приложений, в которой отображаются мои пользовательские приложения, и когда я нажимаю на одно из них, я хочу, чтобы оно активировало приложение с помощью этого кода:
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)
{
val launchAppIntent = context.packageManager.getLaunchIntentForPackage(app.appPackageName)
if (launchAppIntent != null)
{
context.startActivity(launchAppIntent)
}
}
})
return v
}
Ошибка, которую я получаю, находится в строке:
val launchAppIntent = context.packageManager.getLaunchIntentForPackage(app.appPackageName)
appPackageName имеет тип String?но для getLaunchIntentForPackage() требуется строка. Я пытался привязать toString() к концу app.appPackageName, но это не работает.
Я думаю, что проблема, с которой я сталкиваюсь, заключается в моем незнании суетливости Kotlin по предотвращению нуля, и я просто пока не знаю, как ее обойти, поскольку я новичок в Kotlin и разработке приложений.
Любая помощь приветствуется. Спасибо!
Комментарии:
1. Вы можете проверить appPackageName перед вызовом этого метода и убедиться, что он не равен null. Например,
if (app.appPackageName != null) ...
2. Привет, спасибо @tomerpacific ! Я попытался поместить его перед myLayout.setOnClickListener, перед переопределением fun onClick и перед val launcherAppIntent, но у него все еще возникают проблемы. Где вы рекомендуете мне разместить проверку?
Ответ №1:
Ошибка, которую вы получаете, заключается в том, что при доступе app.appPackageName
есть вероятность, что имя пакета приложения может быть нулевым. Это связано с тем, что этот метод изначально написан на Java, и Kotlin защищает себя в случае значения null. Вот почему его тип — String ?.
Чтобы преодолеть эту проблему, вам необходимо добавить проверку на обнуляемость перед доступом к этому значению. Таким образом, Kotlin интерпретирует его тип как String .
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)
{
val applicationPackageName : String? = app.appPackageName
if (applicationPackageName != null) {
val launchAppIntent = context.packageManager.getLaunchIntentForPackage(applicationPackageName)
if (launchAppIntent != null)
{
context.startActivity(launchAppIntent)
}
}
} else {
//YOUR LOGIC
}
})
return v
}
Комментарии:
1. Еще раз спасибо @tomerpacific, но я все еще получаю следующую ошибку запуска:
java.lang.NullPointerException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkNotNullParameter, parameter convertView
2. Сообщение об ошибке, на которое вы ссылаетесь, относится к другому параметру convertView. Это не имеет никакого отношения к вашему первоначальному вопросу. Если это другая проблема, вы можете открыть другой вопрос.
3. вы правы, не уверен, почему я этого не заметил. Я исправил ошибку, но я все еще не могу активировать приложения при нажатии на них, поэтому я открою другой вопрос. Еще раз спасибо за вашу помощь!