Android Kotlin:相同的片段,具有相同标记的子级

Android Kotlin:相同的片段,具有相同标记的子级,android,view,kotlin,tags,fragment,Android,View,Kotlin,Tags,Fragment,在我的片段中,我有两个带有相同标记“结果”的线性布局。在这些线性布局中,我有另一个带有标记“toggle”的布局和一个带有标记“toggleButton”的按钮 我想要这样:当我点击我的按钮时,它会切换线性布局父项“结果”的线性布局“切换” 但当我这么做的时候: override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceS

在我的片段中,我有两个带有相同标记“结果”的线性布局。在这些线性布局中,我有另一个带有标记“toggle”的布局和一个带有标记“toggleButton”的按钮

我想要这样:当我点击我的按钮时,它会切换线性布局父项“结果”的线性布局“切换

但当我这么做的时候:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        val root = rootLayoutResultSearch
        root.findViewWithTag<Button>("toToggleButton")
        val buttonToggle = view.findViewWithTag<Button>("toToggleButton")

        buttonToggle.setOnClickListener{
            Log.i(TAG, "click")
            val toggle = view.findViewWithTag<LinearLayout>("toToggle")
            if(toggle.visibility == View.GONE){
                toggle.visibility = View.VISIBLE
            }else{
                toggle.visibility = View.GONE
            }
        }
    }
覆盖已创建的视图(视图:视图,savedInstanceState:Bundle?){
super.onViewCreated(视图,savedInstanceState)
val root=rootLayoutResultSearch
root.findViewWithTag(“ToToToggleButton”)
val buttonToggle=view.findViewWithTag(“ToToToggleButton”)
buttonToggle.setOnClickListener{
Log.i(标记“单击”)
val toggle=view.findViewWithTag(“ToToToggle”)
if(toggle.visibility==View.GONE){
toggle.visibility=View.VISIBLE
}否则{
toggle.visibility=View.GONE
}
}
}
它只适用于我的第一个线性布局“结果”。当我点击第二个按钮时,它什么也没做

这里是布局“结果”的xml(我只发布了第一个,第二个是完全相同的)


好的,我已经对您想要实现的目标有了一个快速的想法。它排除了人们通常希望进行的所有错误和一致性检查

package com.example.toggler

import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.view.View
import android.widget.LinearLayout
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val list = arrayListOf<View>()
        root_View.findViewsWithText(list, "toToggleButton", View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION)
        list.forEach { button ->
            button.setOnClickListener { v: View ->
                val viewParent = v.parent
                if (viewParent is LinearLayout) {
                    val taggedView = viewParent.findViewWithTag<View>("toggle")

                    taggedView.visibility = when {
                        taggedView.visibility == View.GONE -> View.VISIBLE
                        else -> View.GONE
                    }
                }
            }
        }
    }
}
package com.example.toggler
导入android.os.Bundle
导入android.support.v7.app.AppActivity
导入android.view.view
导入android.widget.LinearLayout
导入kotlinx.android.synthetic.main.activity\u main*
类MainActivity:AppCompatActivity(){
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val list=arrayListOf()
根视图。查找带文本的视图(列表,“ToToToggleButton”,查看。查找带内容描述的视图)
list.forEach{button->
button.setOnClickListener{v:View->
val viewParent=v.parent
如果(viewParent是LinearLayout){
val taggedView=viewParent.findViewWithTag(“切换”)
taggedView.visibility=when{
taggedView.visibility==View.GONE->View.visibility
else->View.go
}
}
}
}
}
}
activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/root_View"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|end"
            android:contentDescription="toToggleButton"
            android:tag="toToggleButton"
            android:text="toggle"
            tools:ignore="HardcodedText" />

        <View
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:background="#F44336"
            android:tag="toggle" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <Button
            android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|end"
            android:contentDescription="toToggleButton"
            android:tag="toToggleButton"
            android:text="toggle"
            tools:ignore="HardcodedText" />

        <View
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:background="#9C27B0"
            android:tag="toggle" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <Button
            android:id="@+id/button3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|end"
            android:contentDescription="toToggleButton"
            android:tag="toToggleButton"
            android:text="toggle"
            tools:ignore="HardcodedText" />

        <View
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:background="#FFEB3B"
            android:tag="toggle" />
    </LinearLayout>
</LinearLayout>

[编辑] 或者,如果您更喜欢使用标记:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        root_View.findViewsWithTag("toToggleButton").forEach { button ->
            button.setOnClickListener { v: View ->
                val viewParent = v.parent
                if (viewParent is LinearLayout) {
                    val taggedView = viewParent.findViewWithTag<View>("toggle")

                    taggedView.visibility = when {
                        taggedView.visibility == View.GONE -> View.VISIBLE
                        else -> View.GONE
                    }
                }
            }
        }
    }
}

private fun ViewGroup.findViewsWithTag(tag: String): Sequence<View> {
    return sequence {
        for (index in 0 until childCount) {
            val child = getChildAt(index)
            when (child) {
                is ViewGroup -> yieldAll(child.findViewsWithTag(tag))
                is View -> if (child.tag == tag) yield(child)
            }
        }
    }
}
class MainActivity:AppCompatActivity(){
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
根视图。FindViewWithTag(“ToToToggleButton”).forEach{button->
button.setOnClickListener{v:View->
val viewParent=v.parent
如果(viewParent是LinearLayout){
val taggedView=viewParent.findViewWithTag(“切换”)
taggedView.visibility=when{
taggedView.visibility==View.GONE->View.visibility
else->View.go
}
}
}
}
}
}
private fun ViewGroup.FindViewWithTag(标记:字符串):序列{
返回序列{
for(在0中索引,直到childCount){
val child=getChildAt(索引)
何时(儿童){
是ViewGroup->yieldAll(child.findViewWithTag(tag))
是视图->如果(child.tag==tag)产生(child)
}
}
}
}

在发布代码示例时,最好将其清理干净,以便为您寻找答案的人可以将其粘贴到项目中,而无需自己清理。请记住,
findViewWithTag
仅返回带有给定标记的第一个视图。@AndreArtus ok,这就是我“问题”的原因。很抱歉,我在创建问题时没有看到这一点。这对fragment有效吗?因为“sequence”和“yieldAll”不被识别,所以我最终为函数提供了这个解决方案:但我在剩下的部分保留了您的foreach循环。感谢
sequence
yield
yieldAll
是Kotlin序列构建设施的一部分。避免不必要的分配,好吗
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        root_View.findViewsWithTag("toToggleButton").forEach { button ->
            button.setOnClickListener { v: View ->
                val viewParent = v.parent
                if (viewParent is LinearLayout) {
                    val taggedView = viewParent.findViewWithTag<View>("toggle")

                    taggedView.visibility = when {
                        taggedView.visibility == View.GONE -> View.VISIBLE
                        else -> View.GONE
                    }
                }
            }
        }
    }
}

private fun ViewGroup.findViewsWithTag(tag: String): Sequence<View> {
    return sequence {
        for (index in 0 until childCount) {
            val child = getChildAt(index)
            when (child) {
                is ViewGroup -> yieldAll(child.findViewsWithTag(tag))
                is View -> if (child.tag == tag) yield(child)
            }
        }
    }
}