Ошибка перегрузки Ошибка в котлине
Как я могу исправить эту ошибку перегрузки, у меня есть ошибка перегрузки неоднозначности, я синхронизирую ее в своем проекте и очищаю ее и перестраиваю, но мне пригодится ошибка, я добавляю код основной активности в kotlin с 2 активностями макета. Вот фотография ошибка
Вот основной 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
, если он не используется.
РЕДАКТИРОВАТЬ
Чтобы прояснить возможные решения...
- "Изменение имени" - в одном из ваших макетов измените значение ivFoodImage на другое, например
ivFoodImage_Details
. - "удаление неиспользуемого импорта" - самоочевидность и хорошая практика.
- "быть явным" - удалить импорт для того, с которым вы хотите быть явным, а затем делать то, что делает 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
Я попал в ситуацию, когда Котлин не мог решить, какое поле соответствует какому макету.
Странно, но я не мог использовать 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
один за другим.