我的目标是动态地将一个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
错误。
答案 0 :(得分:2)
<强>重写强>
尝试以下方法。它会将ToggleButton
添加到LinearLayout
,然后将LinearLayout
添加到FrameLayout
。我认为这正是你要找的。 (注释掉XML中的LinearLayout
和ToggleButton
,以便您可以看到这项工作。)
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);
}
}