Kotlin:相同的片段,带有相同标签的孩子

时间:2018-11-30 15:58:52

标签: android view kotlin tags fragment

在我的片段中,我有两个带有相同标签“ 结果”的线性布局。在这些线性布局中,我还有另一个带有标签“ 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
            }
        }
    }

它仅对我的第一个线性布局“结果”有效。当我单击第二个按钮时,它什么也没做

这里是布局“结果”的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>

1 个答案:

答案 0 :(得分: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)
            }
        }
    }
}