需要帮助添加以编程方式将ToggleButton添加到FrameLayout,其中一半为layout_weight

时间:2017-10-26 16:28:39

标签: android android-layout android-layout-weight

我的目标是动态地将一个toggleButton添加到frameLayout(它有自己的权重),但是按钮的宽度是frameLayout的一半。我能够在XML中创建我想要的东西,但是我无法以编程方式完成这项工作。

这是我的XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:id="@+id/columns"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:baselineAligned="false"
        android:orientation="horizontal"
        android:weightSum="8">

        <FrameLayout
            android:id="@+id/column_1"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical">


                <View
                    android:layout_width="match_parent"
                    android:layout_height="60dp"
                    android:background="@android:color/background_dark" />

                <View
                    android:layout_width="match_parent"
                    android:layout_height="60dp"
                    android:background="@android:color/background_dark" />

                <View
                    android:layout_width="match_parent"
                    android:layout_height="60dp"
                    android:background="@android:color/background_dark" />

                <View
                    android:layout_width="match_parent"
                    android:layout_height="60dp"
                    android:background="@android:color/background_dark" />

                <View
                    android:layout_width="match_parent"
                    android:layout_height="60dp"
                    android:background="@android:color/background_dark" />

                <View
                    android:layout_width="match_parent"
                    android:layout_height="60dp"
                    android:background="@android:color/background_dark" />

                <View
                    android:layout_width="match_parent"
                    android:layout_height="60dp"
                    android:background="@android:color/background_dark" />

                <View
                    android:layout_width="match_parent"
                    android:layout_height="60dp"
                    android:background="@android:color/background_dark" />

                <View
                    android:layout_width="match_parent"
                    android:layout_height="60dp"
                    android:background="@android:color/background_dark" />

                <View
                    android:layout_width="match_parent"
                    android:layout_height="60dp"
                    android:background="@android:color/background_dark" />

                <View
                    android:layout_width="match_parent"
                    android:layout_height="60dp"
                    android:background="@android:color/background_dark" />

            </LinearLayout>

            <LinearLayout
                android:id="@+id/buttonLayoutWrapper"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:weightSum="2">

                <ToggleButton
                    android:layout_width="0dp"
                    android:layout_height="360dp"
                    android:layout_weight="1"
                    android:checked="true"
                    android:text=""
                    android:textOff=""
                    android:textOn=""/>

            </LinearLayout>

        </FrameLayout>

    </LinearLayout>

</LinearLayout>

请特别注意带有id:buttonLayoutWrapper的LinearLayout以及它的子ToggleButton,因为我需要动态添加它们。为简单起见,我只显示一列,但会再重复7次。

我尝试创建一个单独的类来扩展LinearLayout并添加ToggleButton,认为我可以通过这种方式获得权重,但没有运气。

无论我做什么,我似乎无法让ToggleButton服从layout_weight。

以下是尝试以编程方式执行此操作的示例:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    FrameLayout frameLayout = (FrameLayout) findViewById(R.id.column_1);
    ToggleButton toggleButton = new ToggleButton(this);
    LinearLayout.LayoutParams layoutWrapper = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 360, .5f);
    toggleButton.setChecked(true);
    toggleButton.setText("");
    toggleButton.setTextOn("");
    toggleButton.setTextOff("");
    toggleButton.setLayoutParams(layoutWrapper);
    frameLayout.addView(toggleButton);
}

似乎我需要一个父LinearLayout来设置weightSum以使布局权重在XML版本中起作用。但是,我似乎无法弄清楚如何向此添加LinearLayout父级,然后可以将其添加到FrameLayout而不会出现奇怪的情况:

  

无法将LinearLayout强制转换为FrameLayout

编译时出现

错误。

1 个答案:

答案 0 :(得分:2)

<强>重写

尝试以下方法。它会将ToggleButton添加到LinearLayout,然后将LinearLayout添加到FrameLayout。我认为这正是你要找的。 (注释掉XML中的LinearLayoutToggleButton,以便您可以看到这项工作。)

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        final float dpToPx = getResources().getDisplayMetrics().density;

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final LinearLayout linearLayout = new LinearLayout(this);
        final FrameLayout.LayoutParams frameLP =
            new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,
                                         FrameLayout.LayoutParams.MATCH_PARENT);
        linearLayout.setLayoutParams(frameLP);
        linearLayout.setId(View.generateViewId()); // API 17+ needed
        linearLayout.setWeightSum(2.0f);

        final ToggleButton toggleButton = new ToggleButton(this);
        final LinearLayout.LayoutParams linearLP =
            new LinearLayout.LayoutParams(0, (int) (360 * dpToPx), 1.0f);
        toggleButton.setLayoutParams(linearLP);
        toggleButton.setChecked(true);
        toggleButton.setText("");
        toggleButton.setTextOn("");
        toggleButton.setTextOff("");

        linearLayout.addView(toggleButton);
        final FrameLayout frameLayout = (FrameLayout) findViewById(R.id.column_1);
        frameLayout.addView(linearLayout);
    }
}