繁体   English   中英

我如何(继续,后 Kotlin Android 扩展)访问小部件作为数组元素(双重包含)?

How do I (continue to, post-Kotlin Android Extensions) access widgets as array elements (which are doubly-included)?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在“现代化”一些 15 个月前的代码以利用 Kotlin 扩展视图绑定(从已弃用的 Kotlin Android 扩展编译器插件迁移)。

我遇到的问题与在整个代码中使用Array<ConstraintLayout>类型的变量的做法有关。 这在整个帖子中以charKeys为例。

我在 XML 中使用嵌套的include

我正在努力找出正确的新语法或方法。 我还无法编译此代码。

注意:所有 Kotlin 和 XML 都已缩减为仅相关部分。

首先,“旧”的方式 - 这是完美的工作。

PuzzleFragment.kt

import kotlinx.android.synthetic.main.fragment_puzzle.*
import kotlinx.android.synthetic.main.item_keyboard.*
import kotlinx.android.synthetic.main.item_keyboard.view.*
import kotlinx.android.synthetic.main.item_kkey.view.*
 :
 
class PuzzleFragment : Fragment() {

    lateinit var charKeys: Array<ConstraintLayout>
    
    charKeys = arrayOf(
        kbd_char_0, 
        kbd_char_1
         :
        )

fragment_puzzle.xml

<androidx.constraintlayout.widget.ConstraintLayout 
    android:id="@+id/puzzle_fragment"
    >
    <include layout="@layout/item_keyboard" />
</androidx.constraintlayout.widget.ConstraintLayout>

item_keyboard.xml

<androidx.constraintlayout.widget.ConstraintLayout
    android:id="@+id/keyboard"
    >
    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/kbd_char_0"
        >
        <include layout="@layout/item_kkey" />
    </androidx.constraintlayout.widget.ConstraintLayout>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/kbd_char_1"
        >
        <include layout="@layout/item_kkey" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

item_kkey.xml

<merge xmlns:android="http://schemas.android.com/apk/res/android"
    >
    <TextView
        android:id="@+id/kkey"
        />
</merge>

同样,所有这些都(曾经)有效(使用 Kotlin Android 扩展)。 这段代码允许(允许)我做这样的事情:

PuzzleFragment.kt

    for (x in 0 until someNumber) {
        val shape = charKeys[x].background as GradientDrawable
        shape.setStroke(...)
        charKeys[x].kkey.setTextColor(...)


    for (key in charKeys)
        key.isEnabled = false


    for ((kx, key) in charKeys.withIndex())
        key.elevation = ... //using kx 


    for (cx in 0 until maxGuessLength)
        makeKeyRed(charKeys[cx], true)


    private fun makeKeyRed(key: ConstraintLayout, doRed: Boolean) {
        when {
            doRed -> key.kkey.setTextColor(...)
            key.kkey.text != "#" -> key.kkey.setTextColor(...)
            else -> key.kkey.setTextColor(...)
        }
    }

@@@@@@@@@@@@@@@@@@@@@@@@@

所以 - 这是旧的方式。 一切都很酷。 现在我正在转换这段代码。 我有:

PuzzleFragment.kt

import com.zazzem.thats.databinding.FragmentPuzzleBinding

class PuzzleFragment : Fragment(R.layout.fragment_puzzle) {

    private var _binding: FragmentPuzzleBinding? = null
    private val binding get() = _binding!!

以下代码似乎没问题(IDE 中没有“突出显示”错误):

    lateinit var charKeys: Array<ConstraintLayout>

    charKeys = arrayOf(
        binding.item_keyboard.kbd_char_0, 
        binding.item_keyboard.kbd_char_1,
         :
    )    
    

    for (x in 0 until someNumber) {
        val shape = charKeys[x].background as GradientDrawable
        shape.setStroke(...)

但它与下一行代码“分崩离析”:

        charKeys[x].kkey.setTextColor(...)

它不喜欢这里的“kkey”(“未解析的引用”)。 而且,事实上,基本代码完成 (Ctrl + Space) 没有显示属于 item_kkey 的任何小部件。

我不知道我是否只是遗漏了一些明显的东西? 或者,如果整个“'模糊类型'ConstraintLayouts 数组”方法无效(不再有效)? 或者如果它介于两者之间?

与往常一样,非常感谢任何帮助、建议和想法。

1 个回复

您的.kkey是合成属性的另一种用途,因此如果没有 Kotlin Android 扩展,您就无法做到这一点。 合成属性在你调用它的任何 ConstraintLayout 上使用findViewById来查找子视图。

对于视图绑定,不存在视图的此类属性。 但是生成的类确实具有include块的属性。 这些属性返回您包含的布局文件的生成绑定类。 但是,您尚未在include元素上使用android:id元素,因此无法通过您的绑定类访问它们。

即使你这样做了,这也不会与你的 ConstraintLayout Array 策略兼容。

我建议为了便于转换您的代码,您可以直接替换合成属性,如下所示:

val ConstraintLayout.kkey: TextView get() = findViewById(R.id.kkey)

与合成属性相比,它的一个缺点是每次使用它时都必须找到视图,这比重复使用合成属性时略慢。 但我不认为它在这里很重要,因为这个特定视图始终是您正在搜索的布局的唯一子项。

请注意,此策略具有与他们弃用 Android 扩展相同的弱点。 在任意 ConstraintLayout 上调用它是不安全的。

1 从AppWidgetProvider访问小部件的元素

我建立了一个包含ImageButton的小部件。 如何从AppWidgetProvider访问imagebutton并在其上添加单击侦听器(例如,更改按钮的颜色)? 在一个Activity中,我只会使用findViewById()和setOnClickListener(),但是在Ap ...

2011-02-21 21:07:02 1 543   android
2 Kotlin Android 扩展访问文本视图

所以我正在自学 android 开发,我只是想用 Volley get 调用的结果更新文本视图。 我看过其他 stackoverflow 线程和 kotlin 教程,但似乎没有任何效果。 我有 3 个主要文件正在处理 带有这些视图的 activity_main.xml 主活动.kt Ge ...

4 禁止Javascript访问小部件的DOM元素

如果我开发了一个Javascript小部件,其他人可以不使用iFrame而直接将其嵌入到他们的页面中,那么是否可以防止Javascript从嵌入页面访问小部件的DOM元素? 假设小部件是一个图片库,并且嵌入网站通过Javascript选择了所有图片,并更改了CSS属性和所有点击处理程序。 ...

7 Python Tkinter-包含可扩展小部件的可滚动画布

我正在使用Python Tkinter,并且想在框架或画布中放置可变数量的文本框小部件。 文本框在框架的垂直下方排列,因此第一个位于顶部,第二个位于下面,依此类推。等等。我可以将所有按钮,列表框等小部件放在GUI的“左部分”中,而“右侧部分”将仅包含文本框小部件。 我希望当主窗口最大化时,文 ...

9 在Tkinter上扩展小部件

我希望能够在主窗口上调整窗口小部件的大小,例如在TexMaker中。 我希望用户单击一个小部件的末端并调整其大小,然后将整个元素调整为该大小。 然后,我想按一个按钮,整个画面就会出现或消失。 ! https://drive.google.com/file/d/0B-ln0xUTYKf ...

10 如何扩展TimePicker小部件?

我想在TimePicker中禁用过去的时间数字。 在DatePicker中,有一个特殊的属性可以禁用过去的日期,而对于TimePicker则没有任何人,因此我需要扩展原始的TimePicker。 据我了解,我需要更改布局。 如何获得布局? 重要提示 : android/fram ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM