43 votes

Erreur d'ambiguïté de résolution de surcharge dans kotlin

Comment puis-je résoudre ce problème de Surcharge d'erreur, j'ai Résolution de Surcharge erreur d'Ambiguïté, je synchroniser dans mon projet et de le nettoyer et de le reconstruire, mais il me soufflet d'erreur ,j'ai ajouter l'activité principale de code dans kotlin avec 2 présentation de l'activité Voici une photo de l'erreur Overload Resolution Ambiguity error

Ici est la principale activité.kt

package com.hussein.startup
import android.content.Context
import android.content.Intent
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import kotlinx.android.synthetic.main.activity_food_details.view.*
import  kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.food_ticket.view.*


class MainActivity : AppCompatActivity() {

var adapter:FoodAdapter?=null
var listOfFoods =ArrayList<Food>()
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    // load foods


 listOfFoods.add(Food("Coffee","   Coffee preparation is",R.drawable.a))
   .....

    gvListFood.adapter =adapter

}


class  FoodAdapter:BaseAdapter {
    var listOfFood= ArrayList<Food>()
    var context:Context?=null
    constructor(context:Context,listOfFood:ArrayList<Food>):super(){
        this.context=context
        this.listOfFood=listOfFood
    }
    override fun getView(p0: Int, p1: View?, p2: ViewGroup?): View {
        val food = this.listOfFood[p0]
        var inflator = context!!.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
        var foodView= inflator.inflate(R.layout.food_ticket,null)
        foodView.ivFoodImage.setImageResource(food.image!!)
        foodView.ivFoodImage.setOnClickListener {

            val intent = Intent(context,FoodDetails::class.java)
            intent.putExtra("name",food.name!!)
            intent.putExtra("des",food.des!!)
            intent.putExtra("image",food.image!!)
            context!!.startActivity(intent)
        }
        foodView.tvName.text = food.name!!
        return  foodView

    }

    override fun getItem(p0: Int): Any {
        return listOfFood[p0]
    }

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

    override fun getCount(): Int {

        return listOfFood.size
    }

    }
 }

Voici une mise en page xml

1-activity_food_details.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".FoodDetails">

<ImageView
    android:id="@+id/ivFoodImage"
    android:layout_width="50pt"
    android:layout_height="50pt"
    android:layout_marginTop="52dp"
    app:layout_constraintTop_toTopOf="parent"
    app:srcCompat="@drawable/c"
    app:layout_constraintEnd_toEndOf="parent"
    android:layout_marginEnd="8dp"
    app:layout_constraintStart_toStartOf="parent"
    android:layout_marginStart="8dp"
    app:layout_constraintHorizontal_bias="0.501" />

<TextView
    android:id="@+id/tvName"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginEnd="8dp"
    android:layout_marginStart="8dp"
    android:text="TextView"
    android:textColor="@color/colorPrimary"
    android:textSize="24sp"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.501"
    app:layout_constraintStart_toStartOf="parent"
    android:layout_marginTop="48dp"
    app:layout_constraintTop_toBottomOf="@+id/ivFoodImage" />

<TextView
    android:id="@+id/tvDetails"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginEnd="8dp"
    android:layout_marginStart="8dp"
    android:layout_marginTop="56dp"
    android:text="TextView"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/tvName" />

</android.support.constraint.ConstraintLayout>

2-food_ticket.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="63pt"
android:layout_height="wrap_content"
android:background="@color/gray"
android:orientation="vertical"
android:padding="3pt">

<LinearLayout
    android:gravity="center"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/background"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/ivFoodImage"
        android:layout_width="50pt"
        android:layout_height="50pt"
        app:srcCompat="@drawable/c" />

    <TextView
        android:id="@+id/tvName"    
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="Coffe"
        android:textSize="20sp" />
</LinearLayout>
</LinearLayout> 

62voto

Les Points 2432

Vous définissez ivFoodImage dans les deux de vos mises en page. Et vous êtes l'importation de leurs définitions comme si...

import kotlinx.android.synthetic.main.activity_food_details.view.*
import kotlinx.android.synthetic.main.food_ticket.view.*

Pensez à changer le nom de l'une des mises en page, ou d'être explicite dans la définition de l' foodView, ou la suppression de l'importation avec activity_food_details si il n'est pas utilisé.

MODIFIER

Afin de clarifier les solutions possibles...

  1. "Changement de nom" - dans l'une de vos mises en page, modifier ivFoodImage à autre chose, en ivFoodImage_Details.
  2. "retrait de la inutilisés à l'importation" - explicites et une bonne pratique.
  3. "explicites" - supprimer l'importation pour la personne que vous voulez être explicite, et puis faire ce que l'OP est en train de faire c'est à dire, var foodView = inflator.inflate(R.layout.food_ticket,null), explicitement le chargement à partir d' food_ticket dans ce cas.

Le concept d'utiliser le même nom dans plusieurs mises en page n'est pas mauvais (penser en termes d'interfaces et d'injection). Mais l' kotlinx.android.synthetic est syntaxique, bonbons pour rendre les choses moins verbeux. C'est dans la manière de le but ici.

Voici encore une autre alternative. Si vous essayez d'avoir une mise en page à mettre en œuvre une sorte "d'Interface", il est recommandé de mettre chaque mise en page avec ses propres Kotlin classe et avoir la classe implémente l'interface à la place. Cela peut s'avérer fastidieuse si vous avez beaucoup de ces dispositions, afin de "choisissez votre poison", c'est juste une autre idée.

Dernier, voir @Daniel Wilson réponse. Il permet d'éviter l'erreur du compilateur et le fait de vous spécifier l'espace de noms pour qui ivFoodImage vous souhaitez utiliser.

8voto

Daniel Wilson Points 629

En faisant référence à cette réponse , vous pouvez spécifiquement importer l'ID souhaité et le nommer à l'aide du mot clé as Kotlin

 package XXX

import kotlinx.android.synthetic.main.num_info_inet_plus_pack.view.circle as inetViewCircle
import kotlinx.android.synthetic.main.num_info_pack.view as circle
//...
val inetView = activity.layoutInflater.inflate(R.layout.num_info_pack, parent, false)
inetViewCircle.setBackgroundResource(background)
 

0voto

CoolMind Points 11

@DanielWilson réponse est correcte. Si vous avez 2 semblables dispositions, vous n'avez pas besoin de renommer l'égalité des champs afin de les rendre uniques.

Mais vous devez importer l'égalité de tous les champs un par un en les renommant. Donc, si vous ne l'avez pas renommé dans les mises en page, vous souhaitez renommer dans le code. Par exemple,

import kotlinx.android.synthetic.main.row_profile_balance_refill.amount as refill_amount
import kotlinx.android.synthetic.main.row_profile_balance_refill.reason as refill_reason
import kotlinx.android.synthetic.main.row_profile_balance_withdrawal.amount as withdrawal_amount
import kotlinx.android.synthetic.main.row_profile_balance_withdrawal.reason as withdrawal_reason

Je suis dans la situation où Kotlin ne pouvait pas résoudre le champ correspond à la mise en page.

enter image description here

Étrange, mais je ne pouvais pas utiliser refill_amount et refill_reason. Ensuite, j'ai utilisé la vieille méthode Java findViewById(). Ainsi, une classe à l'image pivote à:

class RefillViewHolder(itemView: View) : AbstractViewHolder(itemView) {
    val amount: TextView = itemView.findViewById(R.id.amount)
    val reason: TextView = itemView.findViewById(R.id.reason)
}

0voto

Stefan Indaco Points 36

La construction hors de la de Les la réponse ci-dessus, j'ai l'habitude de garder mes conventions de nommage simple comme appeler un RecyclerView id @+id/recyclerView. Si j'ai une Activité appelée ExampleActivity.java avec la mise en page R. layout.activity_example, je ne veux pas importer directement chaque seule vue de cette mise en page, je préfère suffit d'importer tous les points de vue de la mise en page. Donc, je serais juste à importer l'ensemble du fichier dans l'activité:

import kotlinx.android.synthetic.main.activity_example.*

pour importer tous les points de vue de mon activité du fichier de mise en page depuis que j'ai l'habitude de l'accès de tous de toute façon. Si votre fichier de mise en page comprend d'autres dispositions, vous devez importer ces dispositions séparément aussi. Donc, si j'utilise un en-tête de mise en page compris dans mon activity_example.xml fichier, je voudrais importer tout fichier de mise en page

import kotlinx.android.synthetic.main.header_layout.*

0voto

garry Points 207

Cela signifie que les ID de ressource dans les fichiers java à partir de fichiers xml ne sont pas correctement importés ou sont importés avec des fichiers d'ID de ressource xml incorrects en raison du même nom.

Supposons que

 ----activity_login 
----activity_main 
 

il y a un textview avec le même id.

Kotlin imports essaie de rechercher tous les identifiants des fichiers xml, et l'identifiant est importé à tort.

Solution :: Supprimez toutes les importations après le copier / coller et suivez alt+enter un par un.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X