以编程方式添加按钮在 API 级别 23 中不起作用。我需要动态生成按钮。我该如何添加它们?

Posted

技术标签:

【中文标题】以编程方式添加按钮在 API 级别 23 中不起作用。我需要动态生成按钮。我该如何添加它们?【英文标题】:Adding buttons programmatically is not working in API level 23. I need the buttons to be dynamically generated. How do I add them? 【发布时间】:2016-09-18 08:24:36 【问题描述】:

以下是向 LinearLayout 动态添加按钮的代码:

private void createAndAddButton()
    
        LinearLayout top_row =  (LinearLayout)findViewById(R.id.act1toprow);

        // Check if Linear Layout is already populated
        if((top_row).getChildCount() > 0)
            ( top_row).removeAllViews();

        // Create an ArrayList to hold the Button objects that we will create
        final ArrayList<ToggleButton> buttonList = new ArrayList<ToggleButton>();

        final ToggleButton b = new ToggleButton(this);

        b.setGravity(Gravity.CENTER_HORIZONTAL);
        b.setId((int)Math.random());
        b.setTextOff("");
        b.setTextOn("");
        b.setBackgroundDrawable(null);

        Drawable drawable = ContextCompat.getDrawable(this, R.drawable.button0);

        b.setText(null);
        b.setTextOn(null);
        b.setTextOff(null);
        drawable.setBounds(0, 0, (int) (50 * this.getResources().getDisplayMetrics().density), (int) (50 * this.getResources().getDisplayMetrics().density));

        ScaleDrawable sd = new ScaleDrawable(drawable, 0, 100, 100);
        b.setCompoundDrawablesWithIntrinsicBounds(sd.getDrawable(), null, null, null);


        b.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
        
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
            
                dealWithButtonClick(b);
            
        );

        buttonList.add(b);

        top_row.addView(buttonList.get(0));
    

以下是我的视图 XML:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    android:id="@+id/activity_main"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    tools:context="ritikasood.testapp.MainActivity">

    <android.support.v7.widget.CardView
        xmlns:card_view="http://schemas.android.com/apk/res-auto"
        android:id="@+id/togglecard_view"
        android:layout_gravity="center"
        android:layout_
        android:layout_
        card_view:cardCornerRadius="4dp"
        android:backgroundTint="@color/lime"
        android:layout_marginTop="20dp"
        android:layout_marginLeft="@dimen/activity_horizontal_margin"
        android:layout_marginRight="@dimen/activity_horizontal_margin">

        <LinearLayout android:layout_
                      android:layout_
                      android:id="@+id/act1toprow"
                      android:gravity="center"
                      android:backgroundTint="@color/purple"
                      android:orientation="horizontal"
                      android:layout_marginTop="20dp"
                      android:layout_alignParentRight="true"
                      android:layout_alignParentEnd="true"
                      android:layout_alignParentLeft="true"
                      android:layout_alignParentStart="true">
        </LinearLayout>

    </android.support.v7.widget.CardView>

</android.support.constraint.ConstraintLayout>

没有运行时错误。应用程序正常启动。

我调试了这段代码,它运行时没有问题,但我仍然看不到视图上的按钮。

【问题讨论】:

【参考方案1】:

ScaleDrawable 的初始级别为 0,不会绘制任何内容。您需要设置一个初始级别。

【讨论】:

感谢您的回答,我在调用 setCompoundDrawablesWithIntrinsicBounds() 之前做了一个 sd.SetLevel(10000)。这并没有解决问题。

以上是关于以编程方式添加按钮在 API 级别 23 中不起作用。我需要动态生成按钮。我该如何添加它们?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式创建 UIView 在 Xcode 11.1 中不起作用

ios UIViewController以编程方式定位按钮不起作用

Mootools:如何将点击功能绑定到以编程方式生成的元素

为啥我的约束在我的 xib 文件中不起作用

UIButton 的 Swift addTarget 在 UIView 中不起作用

在 API 级别 24 中不推荐使用 DatePicker 上的 setSpinnersShown 和 setCalendarViewShown