Ошибка несоответствия строк в отношении PackageManager и getLaunchIntentForPackage в Kotlin

#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. вы правы, не уверен, почему я этого не заметил. Я исправил ошибку, но я все еще не могу активировать приложения при нажатии на них, поэтому я открою другой вопрос. Еще раз спасибо за вашу помощь!