Android 使用xml和约束以编程方式添加自定义按钮
我请求帮助是为了了解解决我的问题的最佳方法: 我有一个可点击元素的动态网格(GridLayout)(通过编程创建),比如按钮,其中每个元素都需要存储GridLayout提供的附加信息。 到目前为止,它只是一个扩展按钮(或任何其他可单击视图)的类。 我想在一个独立的xml文件中表示每个按钮的所有属性,例如包含文本颜色、文本大小、背景以及我可能需要的任何其他与设计相关的属性,避免在分配按钮时对所有内容进行硬编码,但我不知道如何将该布局“赋予”刚刚创建的对象。 另一个要求是每个按钮必须是方形的,即宽度或高度中的一个按钮必须包裹内容,而另一个按钮的尺寸必须与前一个按钮的尺寸相同 我尝试了几种方法,用包含按钮的ConstraintLayout创建了一个新的xml文件,然后创建了一个新的类,将ConstraintLayout子类化,但在视图的层次结构中还有另一个(无用的)级别 实现这一目标的最佳方式是什么Android 使用xml和约束以编程方式添加自定义按钮,android,kotlin,button,Android,Kotlin,Button,我请求帮助是为了了解解决我的问题的最佳方法: 我有一个可点击元素的动态网格(GridLayout)(通过编程创建),比如按钮,其中每个元素都需要存储GridLayout提供的附加信息。 到目前为止,它只是一个扩展按钮(或任何其他可单击视图)的类。 我想在一个独立的xml文件中表示每个按钮的所有属性,例如包含文本颜色、文本大小、背景以及我可能需要的任何其他与设计相关的属性,避免在分配按钮时对所有内容进行硬编码,但我不知道如何将该布局“赋予”刚刚创建的对象。 另一个要求是每个按钮必须是方形的,即宽度
提前谢谢。如果我理解正确,这就是答案。摆脱GridLayout,因为它已被弃用。而是像这样使用RecyclerView:
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvMainMenu"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent" />
private fun setUpRecyclerView(menuItemsList: ArrayList<MenuItem>) {
rvMainMenu.layoutManager = GridLayoutManager(this, 1) //number represents the number of items in a row
val menuAdapter = MenuItemAdapter(this, menuItemsList)
rvMainMenu.adapter = menuAdapter
menuAdapter.setOnClickListener(object : MenuItemAdapter.OnClickListener
{
override fun onClick(position: Int, model: MenuItem) {
when(model.id)
{
idOfModel -> doSomething()
}
})
}
}
然后,您需要创建适配器来处理模型中的数据输入:
打开类MenuItemAdapter(私有val上下文:上下文,私有var列表:ArrayList):
RecyclerView.Adapter()
{
私有变量onClickListener:onClickListener?=null
fun setOnClickListener(onClickListener: OnClickListener)
{
this.onClickListener = onClickListener
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return MyViewHolder(
LayoutInflater.from(context).inflate(R.layout.menu_item, parent, false)
)
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val menuItemModel = list[position]
if (holder is MyViewHolder)
{
holder.itemView.iv_menu_item_image.setImageResource(menuItemModel.icon)
holder.itemView.tv_menu_item_title.text = menuItemModel.title
holder.itemView.setOnClickListener {
if (onClickListener != null)
{
onClickListener!!.onClick(position, menuItemModel)
}
}
}
}
override fun getItemCount(): Int {
return list.size
}
interface OnClickListener
{
fun onClick(position: Int, model: MenuItem)
}
private class MyViewHolder(view: View) : RecyclerView.ViewHolder(view)
}
最后告诉recyclerView要显示什么。如果需要栅格布局,请按如下方式使用:
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvMainMenu"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent" />
private fun setUpRecyclerView(menuItemsList: ArrayList<MenuItem>) {
rvMainMenu.layoutManager = GridLayoutManager(this, 1) //number represents the number of items in a row
val menuAdapter = MenuItemAdapter(this, menuItemsList)
rvMainMenu.adapter = menuAdapter
menuAdapter.setOnClickListener(object : MenuItemAdapter.OnClickListener
{
override fun onClick(position: Int, model: MenuItem) {
when(model.id)
{
idOfModel -> doSomething()
}
})
}
}
private fun setUpRecyclerView(menuItemsList:ArrayList){
rvmain menu.layoutManager=GridLayoutManager(this,1)//number表示一行中的项目数
val menuAdapter=MenuItemAdapter(此,menuItemsList)
rvmain menu.adapter=menuAdapter
menuAdapter.setOnClickListener(对象:MenuItemAdapter.OnClickListener
{
覆盖趣味onClick(位置:Int,型号:MenuItem){
何时(model.id)
{
idOfModel->doSomething()
}
})
}
}
这就是如何在Adaptive视图中显示从文件、数据库、api或任何内容收集的动态数据的方法(另外,您还可以通过更改几行代码将recyclerView用作listView)