web-dev-qa-db-ja.com

Kotlinでの多重定義解決のあいまいさエラー

この過負荷エラーを修正するにはどうすればいいですか、過負荷解決のあいまいエラーがあります。プロジェクトで同期してクリーンアップして再構築しますが、エラーが表示されます。2つのレイアウトアクティビティを含むKotlinにメインアクティビティコードを追加しますエラー - 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> 
34
MB_Coder

両方のレイアウトでivFoodImageを定義しています。そして、あなたはそのようにそれらの定義をインポートしています...

_import kotlinx.Android.synthetic.main.activity_food_details.view.*
import kotlinx.Android.synthetic.main.food_ticket.view.*
_

レイアウトの1つで名前を変更するか、foodViewの定義で明示するか、使用されていない場合は_activity_food_details_でインポートを削除することを検討してください。

[〜#〜]編集[〜#〜]

可能な解決策を明確にするには...

  1. 「名前の変更」-レイアウトの1つで、ivFoodImageを_ivFoodImage_Details_のようなものに変更します。
  2. 「未使用のインポートの削除」-自明で良い習慣。
  3. 「明示的」-明示的にしたいもののインポートを削除し、OPが実行していることを実行します。つまり、var foodView = inflator.inflate(R.layout.food_ticket,null)、この場合は_food_ticket_から明示的にロードします。

複数のレイアウトで同じ名前を使用するという概念は悪くありません(インターフェースとインジェクションに関して考えてください)。しかし、_kotlinx.Android.synthetic_は、物事を冗長にしない構文キャンディです。ここでの目標の邪魔になります。

ここにさらに別の選択肢があります。レイアウトに一種の「インターフェース」を実装させる場合は、各レイアウトを独自のKotlinクラスでラップし、代わりにクラスにインターフェースを実装させることを検討してください。そのようなレイアウトがたくさんある場合、これは退屈になる可能性があるので、「毒を選びなさい」、これは単なる別のアイデアです。

最後に、@ Daniel Wilsonの回答を参照してください。コンパイラエラーを回避し、ivFoodImageを使用する名前空間を指定します。

52
Les

この回答を参照 、必要な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)
8
Daniel Wilson

上記のレの答えに基づいて、私は通常、RecyclerViewのID @ + id/recyclerViewを呼び出すなど、命名規則を単純にしておくのが好きです。レイアウトがR.layout.activity_exampleのExampleActivity.Javaというアクティビティがある場合、そのレイアウトのすべてのビューを直接インポートするのではなく、レイアウトからすべてのビューをインポートします。だから私は単にアクティビティ全体でファイル全体をインポートします:

import kotlinx.Android.synthetic.main.activity_example.*

通常はとにかくすべてのビューにアクセスするため、アクティビティのレイアウトファイルからすべてのビューをインポートします。レイアウトファイルに他のレイアウトが含まれている場合は、それらのレイアウトも個別にインポートする必要があります。したがって、activity_example.xmlファイルに含まれているヘッダーレイアウトを使用する場合、そのレイアウトファイル全体をインポートします

import kotlinx.Android.synthetic.main.header_layout.*
0
Stefan Indaco

@DanielWilsonの答えは正しいです。 2つの類似したレイアウトがある場合、それらを一意にするために同じフィールドの名前を変更する必要はありません。

ただし、すべての等しいフィールドを1つずつインポートして、名前を変更する必要があります。したがって、in layoutsの名前を変更していない場合は、-in codeに名前を変更します。例えば、

_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_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)
}
_
0
CoolMind

これは、JavaファイルのリソースIDが正しくインポートされないか、同じ名前のために間違ったxmlリソースIDファイルでインポートされることを意味します。

のために

----activity_login 
----activity_main 

同じIDのテキストビューがあります。

KotlinインポートはすべてのxmlファイルIDを検索しようとし、IDが誤ってインポートされます。

ソリューション ::コピー/貼り付け後にすべてのインポートを削除し、alt+enterを1つずつ実行します。

0
garry