【问题标题】:Kotlin : same fragment, children with same tagKotlin:相同的片段,具有相同标签的孩子
【发布时间】:2018-11-30 15:58:52
【问题描述】:

在我的 fragment 中,我有两个带有相同标签“result”的线性布局。在这些线性布局中,我有另一个带有“toggle”标签的布局和一个带有“toggleButton”标签的按钮。

我想要:当我点击我的按钮时,它会切换其线性布局父级“result”的线性布局“toggle

但是当我这样做时:

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
            }
        }
    }

它仅适用于我的第一个线性布局“结果”。当我点击我的第二​​个按钮时,它什么也没做

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

<LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical"
                    android:tag="result"
                    android:contentDescription="result">
                    <LinearLayout
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:orientation="vertical"
                            android:padding="35dp"
                            android:background="@drawable/whit_bg_and_shadow"
                            android:tag="visibleNotChangeable"
                            >

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

                                <TextView
                                    style="@style/hoursSearch"
                                    android:layout_width="wrap_content"
                                    android:layout_height="wrap_content"
                                    android:layout_weight=".1"
                                    android:fontFamily="@font/rubik_medium_italic"
                                    android:tag="heureDepart"
                                    android:text="@string/fillHoursRecherche1"
                                    android:textStyle="italic" />

                                <TextView
                                    style="@style/citySearch"
                                    android:layout_width="wrap_content"
                                    android:layout_height="wrap_content"
                                    android:layout_marginStart="15dp"
                                    android:layout_weight=".9"
                                    android:fontFamily="@font/rubik_medium"
                                    android:tag="villeDepart"
                                    android:text="@string/fillVilleRecherche1"

                                    android:textSize="18sp" />


                            </LinearLayout>

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

                                <TextView
                                    style="@style/hoursSearch"
                                    android:layout_width="wrap_content"
                                    android:layout_height="wrap_content"
                                    android:layout_weight=".1"
                                    android:fontFamily="@font/rubik_medium_italic"
                                    android:tag="heureDepart"
                                    android:text="@string/fillHoursRecherche2"
                                    android:textFontWeight="500"
                                    android:textStyle="italic" />

                                <TextView
                                    style="@style/citySearch"
                                    android:layout_width="wrap_content"
                                    android:layout_height="wrap_content"
                                    android:layout_marginStart="15dp"
                                    android:layout_weight=".9"
                                    android:fontFamily="@font/rubik_medium"
                                    android:tag="villeDepart"
                                    android:text="@string/fillVilleRecherche2"
                                    android:textSize="18sp" />


                            </LinearLayout>

                            <LinearLayout
                                android:layout_width="match_parent"
                                android:layout_height="wrap_content"
                                android:gravity="end"
                                android:orientation="horizontal">

                                <TextView
                                    android:layout_width="wrap_content"
                                    android:layout_height="wrap_content"
                                    android:layout_marginStart="15dp"
                                    android:fontFamily="@font/roboto"
                                    android:tag="villeArrivee"
                                    android:text="@string/jourCircuRecherche" />


                                <TextView
                                    android:layout_width="wrap_content"
                                    android:layout_height="wrap_content"
                                    android:fontFamily="@font/roboto"
                                    android:tag="villeArrivee"
                                    android:text="@string/fillJourCircuRecherche" />
                            </LinearLayout>

                            <View style="@style/HorizontalLine" />

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

                                <ImageView
                                    android:layout_width="wrap_content"
                                    android:layout_height="wrap_content"
                                    android:src="@drawable/bus" />

                                <TextView
                                    android:layout_width="wrap_content"
                                    android:layout_height="wrap_content"
                                    android:layout_gravity="center"
                                    android:layout_marginStart="15dp"
                                    android:background="@drawable/dark_blue_rectangle"
                                    android:text="3"
                                    android:textColor="@color/colorWhite" />

                            </LinearLayout>

                            <View style="@style/HorizontalLine" />

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

                                <ImageView
                                    android:layout_width="20dp"
                                    android:layout_height="20dp"
                                    android:src="@drawable/horaire" />

                                <TextView
                                    android:layout_width="wrap_content"
                                    android:layout_height="wrap_content"
                                    android:layout_gravity="center"
                                    android:layout_marginStart="15dp"
                                    android:fontFamily="@font/roboto"
                                    android:text="@string/fillTempsRecherche" />

                            </LinearLayout>


                        </LinearLayout>
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:orientation="vertical"
                        android:padding="35dp"
                        android:background="@drawable/gray_bg"
                        android:visibility="gone"
                        android:tag="toToggle"
                        >

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

                            <TextView
                                style="@style/hoursSearch"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_weight=".1"
                                android:fontFamily="@font/rubik_medium_italic"
                                android:tag="heureDepart"
                                android:text="@string/fillHoursRecherche1"
                                android:textStyle="italic" />

                            <TextView
                                style="@style/citySearch"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_marginStart="15dp"
                                android:layout_weight=".9"
                                android:fontFamily="@font/rubik_medium"
                                android:tag="villeDepart"
                                android:text="@string/fillVilleRecherche1"

                                android:textSize="18sp" />


                        </LinearLayout>

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

                            <TextView
                                style="@style/hoursSearch"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_weight=".1"
                                android:fontFamily="@font/rubik_medium_italic"
                                android:tag="heureDepart"
                                android:text="@string/fillHoursRecherche2"
                                android:textFontWeight="500"
                                android:textStyle="italic" />

                            <TextView
                                style="@style/citySearch"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_marginStart="15dp"
                                android:layout_weight=".9"
                                android:fontFamily="@font/rubik_medium"
                                android:tag="villeDepart"
                                android:text="@string/fillVilleRecherche2"
                                android:textSize="18sp" />


                        </LinearLayout>

                        <LinearLayout
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:gravity="end"
                            android:orientation="horizontal">

                            <TextView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_marginStart="15dp"
                                android:fontFamily="@font/roboto"
                                android:tag="villeArrivee"
                                android:text="@string/jourCircuRecherche" />


                            <TextView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:fontFamily="@font/roboto"
                                android:tag="villeArrivee"
                                android:text="@string/fillJourCircuRecherche" />
                        </LinearLayout>

                        <View style="@style/HorizontalLine" />

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

                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:src="@drawable/bus" />

                            <TextView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_gravity="center"
                                android:layout_marginStart="15dp"
                                android:background="@drawable/dark_blue_rectangle"
                                android:text="3"
                                android:textColor="@color/colorWhite" />

                        </LinearLayout>

                        <View style="@style/HorizontalLine" />

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

                            <ImageView
                                android:layout_width="20dp"
                                android:layout_height="20dp"
                                android:src="@drawable/horaire" />

                            <TextView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_gravity="center"
                                android:layout_marginStart="15dp"
                                android:fontFamily="@font/roboto"
                                android:text="@string/fillTempsRecherche" />

                        </LinearLayout>

                    </LinearLayout>
                    <Button
                        android:id="@+id/ToggleSearchResult"
                        android:layout_width="40dp"
                        android:layout_height="40dp"
                        android:background="@drawable/arrow_down_blue_circle"
                        android:layout_gravity="center"
                        android:layout_marginTop="-20dp"
                        android:tag="toToggleButton"
                        />
                </LinearLayout>

【问题讨论】:

  • 发布代码示例时,将其清理到为您寻求答案的人可以将其粘贴到项目中而无需自己清理的程度可能会更有帮助。
  • 请记住,findViewWithTag 只返回带有给定标签的第一个视图。
  • @AndreArtus 好的,这就是我的“问题”的原因^^。抱歉,我在创建问题时没有看到这一点。

标签: android view kotlin tags fragment


【解决方案1】:

好的,我已经对我认为您想要完成的任务做了一个快速的了解。它排除了人们通常想做的所有错误和一致性检查。

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
                    }
                }
            }
        }
    }
}

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)
            }
        }
    }
}

【讨论】:

  • 这适用于片段吗?因为“sequence”和“yieldAll”无法识别
  • 我最终得到了这个函数的解决方案:stackoverflow.com/questions/8817377/…,但我保留了你的 foreach 循环。谢谢
  • sequenceyieldyieldAll 是 Kotlin 序列构建工具的一部分。它只是避免不必要的分配。
  • 好的,谢谢,但我没有被识别(编译时出错)
  • 您需要启用 Kotlin 协程(版本 1.3.x)。
猜你喜欢
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多