kotlin中的过载分辨率模糊错误

时间:2017-09-05 00:21:02

标签: android xml android-layout kotlin

如何修复此Overload错误,我有Overload Resolution Ambiguity错误,我在我的项目中同步它并清理它并重建它但是它让我明显错误,我在kotlin中添加了2个布局活动的主要活动代码 这是错误的照片 Overload Resolution Ambiguity error

这是一个主要活动.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> 

5 个答案:

答案 0 :(得分:46)

您正在两个布局中定义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加载。
  4. 在多个布局中使用相同名称的概念也不错(从接口和注入的角度来看)。但kotlinx.android.synthetic是一种语法糖果,可以减少冗长。它妨碍了这里的目标。

    这是另一种选择。如果你想让一个布局实现一种“接口”,考虑用自己的Kotlin类包装每个布局,让类实现接口。如果你有很多这样的布局,这可能会变得乏味,所以“选择你的毒药”,这只是另一个想法。

    最后,请参阅@Daniel Wilson的回答。它避免了编译器错误,并使您指定要使用ivFoodImage的命名空间。

答案 1 :(得分:7)

Referencing this answer,您可以专门导入所需的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)

答案 2 :(得分:0)

@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

我遇到Kotlin无法解析哪个字段对应哪种布局的情况。

enter image description here

很奇怪,但是我不能使用refill_amountrefill_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)
}

答案 3 :(得分:0)

基于上面Les的回答,我通常喜欢保持命名约定简单,例如调用RecyclerView的id @ + id / recyclerView。如果我有一个名为ExampleActivity.java的Activity,其布局为R.layout.activity_example,则我不想直接导入该布局中的每个视图,而只希望从布局中导入所有视图。所以我将整个文件导入到活动中:

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

从活动的布局文件导入所有视图,因为我通常无论如何都访问它们。如果您的布局文件包含其他布局,则也必须分别导入这些布局。因此,如果我使用activity_example.xml文件中包含的标题布局,则会导入整个布局文件

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

答案 4 :(得分:0)

这意味着未正确导入xml文件中的java文件中的资源ID,或者由于名称相同而导入了错误的xml资源ID文件。

假设

----activity_login 
----activity_main 

有一个具有相同ID的文本视图。

Kotlin导入尝试搜索每个xml文件ID,但该ID错误导入。

解决方案 ::在复制/粘贴后删除所有导入内容,并一步一步遵循alt+enter