Android 使用xml和约束以编程方式添加自定义按钮

Android 使用xml和约束以编程方式添加自定义按钮,android,kotlin,button,Android,Kotlin,Button,我请求帮助是为了了解解决我的问题的最佳方法: 我有一个可点击元素的动态网格(GridLayout)(通过编程创建),比如按钮,其中每个元素都需要存储GridLayout提供的附加信息。 到目前为止,它只是一个扩展按钮(或任何其他可单击视图)的类。 我想在一个独立的xml文件中表示每个按钮的所有属性,例如包含文本颜色、文本大小、背景以及我可能需要的任何其他与设计相关的属性,避免在分配按钮时对所有内容进行硬编码,但我不知道如何将该布局“赋予”刚刚创建的对象。 另一个要求是每个按钮必须是方形的,即宽度

我请求帮助是为了了解解决我的问题的最佳方法: 我有一个可点击元素的动态网格(GridLayout)(通过编程创建),比如按钮,其中每个元素都需要存储GridLayout提供的附加信息。 到目前为止,它只是一个扩展按钮(或任何其他可单击视图)的类。 我想在一个独立的xml文件中表示每个按钮的所有属性,例如包含文本颜色、文本大小、背景以及我可能需要的任何其他与设计相关的属性,避免在分配按钮时对所有内容进行硬编码,但我不知道如何将该布局“赋予”刚刚创建的对象。 另一个要求是每个按钮必须是方形的,即宽度或高度中的一个按钮必须包裹内容,而另一个按钮的尺寸必须与前一个按钮的尺寸相同

我尝试了几种方法,用包含按钮的ConstraintLayout创建了一个新的xml文件,然后创建了一个新的类,将ConstraintLayout子类化,但在视图的层次结构中还有另一个(无用的)级别

实现这一目标的最佳方式是什么


提前谢谢。

如果我理解正确,这就是答案。摆脱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)