Android Kotlin:相同的片段,具有相同标记的子级
在我的片段中,我有两个带有相同标记“结果”的线性布局。在这些线性布局中,我有另一个带有标记“toggle”的布局和一个带有标记“toggleButton”的按钮 我想要这样:当我点击我的按钮时,它会切换线性布局父项“结果”的线性布局“切换” 但当我这么做的时候: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
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)
}
}
}
}