如何在 LinearLayout 中点击视图?
How to click view in LinearLayout?
Dialog
中有多个可选TextView
。
我正在寻找一种方法,通过在LinearLayout
中选择multiple views
来获得text values
。
作为第一种方法,我想到了在设置好各个视图的变量后,如何设置点击事件。但是这样会使代码变得又长又乱。
作为第二种方法,我想到了使用RecyclerView
来放置视图并设置点击事件。
这听起来是个好方法,但似乎效率低下,因为项目数量太少,使用 RecyclerView
.
没有意义
如何设置点击事件获取LinearLayout
中views的值?
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
那么就这样做。如果你认为它可以增加范围然后使用 RecyclerView
。如果您认为会有一个中间点让事情增长但不会那么多,请创建自定义视图。
Dialog
中有多个可选TextView
。
我正在寻找一种方法,通过在LinearLayout
中选择multiple views
来获得text values
。
作为第一种方法,我想到了在设置好各个视图的变量后,如何设置点击事件。但是这样会使代码变得又长又乱。
作为第二种方法,我想到了使用RecyclerView
来放置视图并设置点击事件。
这听起来是个好方法,但似乎效率低下,因为项目数量太少,使用 RecyclerView
.
如何设置点击事件获取LinearLayout
中views的值?
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
那么就这样做。如果你认为它可以增加范围然后使用 RecyclerView
。如果您认为会有一个中间点让事情增长但不会那么多,请创建自定义视图。