Ошибка перегрузки Ошибка в котлине

Как я могу исправить эту ошибку перегрузки, у меня есть ошибка перегрузки неоднозначности, я синхронизирую ее в своем проекте и очищаю ее и перестраиваю, но мне пригодится ошибка, я добавляю код основной активности в kotlin с 2 активностями макета. Вот фотография ошибка Overload Resolution Ambiguity error

Вот основной activity.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
    }

    }
 }

Вот макет 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> 

Ответы

Ответ 1

Вы определяете ivFoodImage в обоих своих макетах. И вы импортируете свои определения так...

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

Рассмотрим изменение имени в одном из макетов, или быть явно в определении foodView или удаление импорта с activity_food_details, если он не используется.

РЕДАКТИРОВАТЬ

Чтобы прояснить возможные решения...

  1. "Изменение имени" - в одном из ваших макетов измените значение ivFoodImage на другое, например ivFoodImage_Details.
  2. "удаление неиспользуемого импорта" - самоочевидность и хорошая практика.
  3. "быть явным" - удалить импорт для того, с которым вы хотите быть явным, а затем делать то, что делает OP, т.е. var foodView = inflator.inflate(R.layout.food_ticket,null), явно загружая из food_ticket в этом случае,

Понятие использования одного и того же имени в нескольких макетах неплохо (подумайте с точки зрения интерфейсов и инъекций). Но kotlinx.android.synthetic - синтаксическая конфета, чтобы сделать вещи менее подробными. Это мешает цели здесь.

Вот еще одна альтернатива. Если вы пытаетесь реализовать компоновку своего рода "Интерфейс", рассмотрите возможность упаковки каждого макета с собственным классом Kotlin и вместо этого реализуйте интерфейс класса. Это может стать утомительным, если у вас много таких макетов, поэтому "выберите свой яд", это просто еще одна идея.

Наконец, см. Ответ @Даниэль Уилсон. Он избегает ошибки компилятора и позволяет указать пространство имен, для которого вы хотите использовать ivFoodImage.

Ответ 2

Ссылаясь на этот ответ, вы можете специально импортировать ID, который хотите, и назвать его с помощью Kotlin as ключевого слова

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)

Ответ 3

@DanielWilson ответ правильный. Если у вас есть 2 одинаковых макета, вам не нужно переименовывать одинаковые поля, чтобы сделать их уникальными.

Но вы должны импортировать все равные поля один за другим, переименовывая их. Итак, если вы не переименовали в макетах, вы бы переименовали их в коде. Например,

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

Я попал в ситуацию, когда Котлин не мог решить, какое поле соответствует какому макету.

enter image description here

Странно, но я не мог использовать refill_amount и refill_reason. Затем я использовал старый метод Java findViewById(). Итак, класс на картинке превращается в:

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

Ответ 4

Опираясь на ответ Леса выше, я обычно предпочитаю, чтобы мои соглашения об именах были такими простыми, как вызов RecyclerView id @+id/recyclerView. Если у меня есть Activity с именем ExampleActivity.java с макетом R.layout.activity_example, я не хочу напрямую импортировать каждое отдельное представление в этом макете, я бы просто импортировал все представления из макета. Поэтому я просто импортировал весь файл в упражнении:

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

чтобы импортировать все виды из моего файла макета активности, так как я в любом случае получаю к ним доступ. Если ваш файл макета содержит другие макеты, вам придется импортировать эти макеты отдельно. Поэтому, если я использую макет заголовка, включенный в мой файл activity_example.xml, я импортирую весь этот файл макета

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

Ответ 5

Это означает, что идентификаторы ресурсов в файлах Java из файлов XML не импортируются должным образом или импортируются с неправильными файлами идентификаторов ресурсов XML из-за того же имени.

Предположим, для

----activity_login 
----activity_main 

есть текстовое представление с тем же идентификатором.

Kotlin import пытается найти все идентификаторы XML файла, и этот идентификатор импортируется неправильно.

Решение:: Удалить все операции импорта после копирования/вставки и следовать alt+enter один за другим.