以编程方式插入的按钮样式无法正常工作

Posted

技术标签:

【中文标题】以编程方式插入的按钮样式无法正常工作【英文标题】:Programmatically inserted Button style not working properly 【发布时间】:2021-06-01 04:07:49 【问题描述】:

我对以编程方式插入的 Button 的样式有疑问。我在论坛上搜索了很多东西,但对我没有任何帮助...

在下面的theme.xml文件中,我有一个按钮,当我在片段的xml代码中设置样式时效果很好。

<style name="LargeMarginButton" parent="Widget.MaterialComponents.Button">
    <item name="android:insetTop">0dp</item>
    <item name="android:insetBottom">0dp</item>
    <item name="cornerRadius">0dp</item>
    <item name="android:layout_margin">15dp</item>
    <item name="android:layout_height">70dp</item>
    <item name="android:layout_width">250dp</item>
</style>

当我尝试以编程方式添加按钮时,layout_marginlayout_heightlayout_width 根本不起作用,当我在日志中显示边距时,所有按钮都返回 0。

class TreatmentsPresentationFragment : Fragment() 

    private var _binding: FragmentTreatmentsPresentationBinding? = null
    private val binding get() = _binding!!
    private lateinit var mainActivity: MainActivity

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View 
        _binding = FragmentTreatmentsPresentationBinding.inflate(inflater, container, false)

        loadButtons()

        mainActivity = activity as MainActivity
        return binding.root
    

    private fun loadButtons() 
        val treatmentVideos = db.getVideos(false)
        
        // insert buttons in the fragment
        for (video in treatmentVideos) 
                
            // create a button with style
            val buttonContext = ContextThemeWrapper(requireContext(), R.style.LargeMarginButton)
            val button = MaterialButton(buttonContext, null)
        
    

似乎所有layout_* 元素都被忽略了..

有同样问题的人,或者可以看到我做错了什么的人可以帮助我吗?

谢谢。

于 2021 年 4 月 13 日编辑 感谢Ben P.,我了解了它的工作原理,并且我正在使用带有基于我的按钮视图的适配器的回收器视图,以使其完美运行。

【问题讨论】:

所有layout_ 属性实际上是ViewLayoutParams 的属性。哪种类型的 LayoutParams(例如,ConstraintLayout.LayoutParamsLinearLayout.LayoutParams)取决于您将视图添加到的父 ViewGroup。 好的,但我不明白为什么当我将按钮放在 xml 中时它会起作用,以及为什么当我以编程方式放置按钮时它不起作用 当您从 xml 膨胀时,LayoutInflater 负责根据 layout_ 属性创建 LayoutParams 对象。当您仅在代码中实例化视图时,不会出现 LayoutInflater 的更大上下文。 【参考方案1】:

您尚未将您的 MaterialsButtons 添加到任何 ViewGroup,例如 LinearLayout、RelativeLayout 等。 在for 内部,像这样添加它们:

private fun loadButtons() 
        val treatmentVideos = db.getVideos(false)
        
        // insert buttons in the fragment
        for (video in treatmentVideos) 
                
            // create a button with style
            val buttonContext = ContextThemeWrapper(requireContext(), R.style.LargeMarginButton)
            val button = MaterialButton(buttonContext)

            //Adding button to LienarLayout
            binding.your_linear_layout.addView(button)
        
    

不要忘记通过addView(View child, LayoutParams params) 将 LayoutParams 设置为您的按钮。取决于您希望添加按钮的 ViewGroup

【讨论】:

对不起,我删除了这部分,因为如果我让这部分代码,我的代码有点长,但是我连续添加了 3 个按钮,并且我的行在表格布局中这不是问题因为如果我没有将按钮添加到视图中,它们将不会显示

以上是关于以编程方式插入的按钮样式无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式设置 Android 按钮样式

为啥我以编程方式创建的按钮的样式不同?

以编程方式确定 Qt 样式表选项?

多个提示的单选按钮自定义样式

向AppTheme添加按钮样式不起作用

以编程方式在电子表格中设置边框颜色和样式