findViewById错误 - 没有足够的信息推断类型变量T。我复制了Java代码并在网上转换了它。

3

从 diolor/swipecards(GitHub)复制了 Java 代码,使用在线工具将其转换为 Kotlin。已纠正其中的一些错误,但在 OnScroll 函数中仍存在此错误(findViewById)。

package com.example.fanatic

import android.content.Context
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.ArrayAdapter
import android.widget.Toast
import com.lorentzos.flingswipe.SwipeFlingAdapterView

class Swipe_card_activity : AppCompatActivity() {


    private var al:ArrayList<String> = TODO()
    private lateinit var arrayAdapter:ArrayAdapter<String>
    private var i:Int = 0

    override fun onCreate(savedInstanceState:Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_swipe_card_activity)
        al = ArrayList()
        al.add("php")
        al.add("c")
        al.add("python")
        al.add("java")
        al.add("html")
        al.add("c++")
        al.add("css")
        al.add("javascript")


        arrayAdapter = ArrayAdapter(this, R.layout.item, R.id.helloText, al)

        val flingContainer : SwipeFlingAdapterView = findViewById<SwipeFlingAdapterView>(R.id.frame)

        flingContainer.setAdapter(arrayAdapter)
        flingContainer.setFlingListener(object: SwipeFlingAdapterView.onFlingListener {
            override fun removeFirstObjectInAdapter() {
                // this is the simplest way to delete an object from the Adapter (/AdapterView)
                Log.d("LIST", "removed object!")
                al.removeAt(0)
                arrayAdapter.notifyDataSetChanged()
            }
            override fun onLeftCardExit(dataObject:Any) {
                //Do something on the left!
                //You also have access to the original object.
                //If you want to use it just cast it (String) dataObject
                makeToast(this@Swipe_card_activity, "Left!")
            }
            override fun onRightCardExit(dataObject:Any) {
                makeToast(this@Swipe_card_activity, "Right!")
            }
            override fun onAdapterAboutToEmpty(itemsInAdapter:Int) {
                // Ask for more data here
                al.add("XML " + (i).toString())
                arrayAdapter.notifyDataSetChanged()
                Log.d("LIST", "notified")
                i++
            }

错误出现在FINDVIEWBYID这里 它的意思是:没有足够的信息推断类型 T。

            **override fun onScroll(scrollProgressPercent:Float) {
               strong textval viuw = flingContainer.selectedView
                viuw.run {
                    findViewById(R.id.item_swipe_right_indicator).setAlpha(if (scrollProgressPercent < 0) -scrollProgressPercent else 0)
                    findViewById(R.id.item_swipe_left_indicator).setAlpha(if (scrollProgressPercent > 0) scrollProgressPercent else 0)**
                }
            }
        })
        // Optionally add an OnItemClickListener
        flingContainer.setOnItemClickListener { itemPosition, dataObject -> makeToast(this@Swipe_card_activity, "Clicked!") }
    }
    fun makeToast(ctx: Context, s:String) {
        Toast.makeText(ctx, s, Toast.LENGTH_SHORT).show()
    }
    @OnClick(R.id.right)
    fun right() {
        /**
         * Trigger the right event manually.
         */
        val flingContainer : SwipeFlingAdapterView = findViewById<SwipeFlingAdapterView>(R.id.frame)
        flingContainer.getTopCardListener().selectRight()
    }
    @OnClick(R.id.left)
    fun left() {
        val flingContainer : SwipeFlingAdapterView = findViewById<SwipeFlingAdapterView>(R.id.frame)
        flingContainer.getTopCardListener().selectLeft()
    }

}

annotation class OnClick(val right: Int)
2个回答

4

我认为你面临的问题是由代码转换引起的。Java不要求你明确地强制转换视图,而Kotlin需要你指定视图的类型。你需要在尖括号内设置视图,像这样:

findViewById<View>(R.id.item_swipe_right_indicator).setAlpha(...)

2
使用 findViewById 获取的类型可能不受限制,因此无法推断类型,在 Kotlin 中需要明确声明或转换类型。
如果您的应用程序针对 API 26 或更高版本,请执行以下操作:
findViewById<THE_VIEW_TYPE>(R.id.item_swipe_right_indicator).setAlpha(...)

否则,对于API 25及以下版本,您可以执行以下操作:
(findViewById(R.id.item_swipe_right_indicator) as THE_VIEW_TYPE).setAlpha(...)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接