从 Android 中的切换按钮中删除填充

Removing padding from toggle button in Android

我正在 android 创建一个简单的切换按钮并将背景设置为可绘制对象。

<ToggleButton
    android:layout_width="wrap_content"
    android:drawablePadding="0dp"
    android:layout_height="wrap_content"
    android:text=""
    android:textSize="12sp"
    android:padding="0dp"
    android:id="@+id/tag_text"
    android:background="@drawable/toggle_selector"/>

toggle_selector.xml 看起来像这样:

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/toggle_button_off" android:state_checked="false"/>
    <item android:drawable="@drawable/toggle_button_on" android:state_checked="true"/>
</selector>

toggle_button_off 和 toggle_button_on 具有可以用一些颜色绘制的简单形状。

这就是我将这个切换按钮膨胀到我的视图中的方式:

View child = getLayoutInflater().inflate(R.layout.tags, null);
        ToggleButton tag = ((ToggleButton)child.findViewById(R.id.tag_text));
        tag.setText("Testing");
        tag.setTextOff("Testing");
        tag.setTextOn("Testing");
        flowlayout.addView(child);

问题是切换按钮中文本周围的填充太多,我无法通过设置 padding = "0dp" 来消除它。这些按钮上的文本是动态添加的,因此设置恒定的高度重量也无济于事。

我通过将 minWidth、minHeight 设置为 0dp 得到了解决方案。在宽度和高度中包装内容。然后将自定义填充添加到我想要的切换按钮。

<ToggleButton
    android:layout_width="wrap_content"
    android:minWidth="0dp"
    android:minHeight="0dp"
    android:layout_height="wrap_content"
    android:text=""
    android:textSize="12sp"
    android:padding="2dp"
    android:id="@+id/tag_text"
    android:background="@drawable/toggle_selector"/>

改为使用 CheckedTextView:

 final CheckedTextView toggle = new CheckedTextView(clipboardWordsLayout.getContext());
 toggle.setText(kanji);
 final int min = Views.dp2px(48, clipboardWordsLayout.getContext());
 toggle.setMinimumWidth(min);
 toggle.setMinimumHeight(min);
 toggle.setGravity(Gravity.CENTER);
 toggle.setBackgroundResource(R.drawable.togglebutton);
 toggle.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
         toggle.setChecked(!toggle.isChecked());
     }
 });