簡體   English   中英

如何在 LinearLayout 中單擊視圖?

[英]How to click view in LinearLayout?

Dialog中有多個可選擇的TextView

我正在尋找一種通過在LinearLayout中一遍又一遍地選擇multiple views來獲取text values的方法。

作為第一種方法,我想到了在設置好每個視圖的變量之后如何設置點擊事件。 但這使得代碼太長太亂。

作為第二種方法,我想到了使用RecyclerView來放置視圖並設置點擊事件。 這聽起來是個好方法,但似乎效率低下,因為項目數量太少,使用RecyclerView毫無意義。

如何設置單擊事件以獲取LinearLayout中的視圖值?

XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ll_body_part"
    android:layout_width="300dp"
    android:layout_height="wrap_content"
    android:orientation="vertical">
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/white">
        <TextView
            android:id="@+id/back"
            android:layout_width="300dp"
            android:layout_height="wrap_content"
            android:text=" BACK "
            android:textSize="20dp"
            android:background="?attr/selectableItemBackground"
            android:gravity="center"
            android:padding="15dp" />

        <ImageView
            android:id="@+id/selection_state1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_dumbbell"
            android:backgroundTint="@android:color/transparent"
            android:layout_gravity="center_vertical|end"
            android:layout_marginRight="20dp"
            android:visibility="invisible"/>
    </FrameLayout>

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/white">
        <TextView
            android:id="@+id/chest"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text=" CHEST "
            android:textSize="20dp"
            android:background="?attr/selectableItemBackground"
            android:gravity="center"
            android:padding="15dp" />

        <ImageView
            android:id="@+id/selection_state2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_dumbbell"
            android:backgroundTint="@android:color/transparent"
            android:layout_gravity="center_vertical|end"
            android:layout_marginRight="20dp"
            android:visibility="invisible"/>
    </FrameLayout>
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/white">
        <TextView
            android:id="@+id/leg"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text=" LEG "
            android:textSize="20dp"
            android:background="?attr/selectableItemBackground"
            android:gravity="center"
            android:padding="15dp" />

        <ImageView
            android:id="@+id/selection_state3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_dumbbell"
            android:backgroundTint="@android:color/transparent"
            android:layout_gravity="center_vertical|end"
            android:layout_marginRight="20dp"
            android:visibility="invisible"/>
    </FrameLayout>
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/white">
        <TextView
            android:id="@+id/shoulder"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text=" SHOULDER "
            android:textSize="20dp"
            android:background="?attr/selectableItemBackground"
            android:gravity="center"
            android:padding="15dp" />

        <ImageView
            android:id="@+id/selection_state4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_dumbbell"
            android:backgroundTint="@android:color/transparent"
            android:layout_gravity="center_vertical|end"
            android:layout_marginRight="20dp"
            android:visibility="invisible"/>
    </FrameLayout>
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/white">
        <TextView
            android:id="@+id/bieceps"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text=" BICEPS "
            android:textSize="20dp"
            android:background="?attr/selectableItemBackground"
            android:gravity="center"
            android:padding="15dp" />

        <ImageView
            android:id="@+id/selection_state"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_dumbbell"
            android:backgroundTint="@android:color/transparent"
            android:layout_gravity="center_vertical|end"
            android:layout_marginRight="20dp"
            android:visibility="invisible"/>
    </FrameLayout>

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/white">
        <TextView
            android:id="@+id/triceps"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text=" TRICEPS "
            android:textSize="20dp"
            android:background="?attr/selectableItemBackground"
            android:gravity="center"
            android:padding="15dp" />

        <ImageView
            android:id="@+id/selection_state6"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_dumbbell"
            android:backgroundTint="@android:color/transparent"
            android:layout_gravity="center_vertical|end"
            android:layout_marginRight="20dp"
            android:visibility="invisible"/>
    </FrameLayout>

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/white">
        <TextView
            android:id="@+id/abs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text=" ABS "
            android:textSize="20dp"
            android:background="?attr/selectableItemBackground"
            android:gravity="center"
            android:padding="15dp" />

        <ImageView
            android:id="@+id/selection_state7"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_dumbbell"
            android:backgroundTint="@android:color/transparent"
            android:layout_gravity="center_vertical|end"
            android:layout_marginRight="20dp"
            android:visibility="invisible"/>
    </FrameLayout>

    <Button
        android:id="@+id/check"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="START"
        android:textSize="27dp"
        android:backgroundTint="@color/purple_200"/>
</LinearLayout>

這是我嘗試過的代碼。

class BodyPartDialogFragment : DialogFragment(), View.OnClickListener{
    private lateinit var ll: LinearLayout
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val view: View = inflater.inflate(R.layout.fragment_body_part_dialog, container, false)
        ll = view.findViewById(R.id.ll_body_part)
        ll.setOnClickListener {
            onClick(it)
        }
        return view
    }
    override fun onClick(view: View?) {
        when (view?.id) {
            R.id.back -> Toast.makeText(context, "back", Toast.LENGTH_LONG)
            R.id.chest -> Toast.makeText(context, "chest", Toast.LENGTH_SHORT)
            R.id.leg -> Toast.makeText(context, "leg", Toast.LENGTH_SHORT)
            R.id.shoulder -> Toast.makeText(context, "shoulder", Toast.LENGTH_SHORT)
            R.id.bieceps -> Toast.makeText(context, "biceps", Toast.LENGTH_SHORT)
            R.id.triceps -> Toast.makeText(context, "triceps", Toast.LENGTH_SHORT)
            R.id.abs -> Toast.makeText(context, "abs", Toast.LENGTH_SHORT)
        }
    }
}

似乎選擇了整個LinearLayout

請告訴我該怎么辦

我應該只使用 Recycler View 嗎?

您不是在單擊視圖,而是在單擊線性布局

ll.setOnClickListener {
   onClick(it) //it here is view, which in this case is the linear layout
}

因此,如果您只想 select 和TextView並且始終是TextView您需要的視圖,您可以遍歷它們:

fun addClickListeners(viewGroup: ViewGroup) {
    for (i in 0 until viewGroup.childCount) {
        val candidate = viewGroup.childAt(i) as? TextView
        if (candidate != null) {
            candidate.setOnClickListener {
                it.text.toString() //do something
            }            
        } else {
          (viewGroup.childAt(i) as? ViewGroup)?.let { 
              addClickListeners(it) //recursive for inner childs    
           }
        }
    }

}

然后像這樣調用它

addClickListeners(ll)

關於您是否應該使用由您決定的RecyclerView 如果您的評估要求足夠低,可以信任始終是TextView ,那么就這樣做。 如果你認為它可以增加 scope 然后使用RecyclerView 如果您認為會有一個中間點,事情會增長但不會增長那么多,請創建一個自定義視圖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM