我正在尝试使用for循环为Android布局添加按钮。我试图为按钮创建一个布局文件,然后我想将具有该布局的按钮添加到布局中。如果我使用注释代码在循环中创建新按钮,但是如果我从布局文件中创建一个新按钮则不行。
public class MainActivity extends ActionBarActivity {
ArrayList<String> panel1 = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
panel1.add("1");
panel1.add("2");
for(String s : panel1){
Button knap = (Button) findViewById(R.id.knap);
//Button knap = new Button(this);
knap.setText(panel1.get(i));
LinearLayout l = (LinearLayout) findViewById(R.id.linearLayout1);
l.addView(knap);
}
包含按钮布局的XML文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="40dp"
android:clickable="true"
android:orientation="vertical"
android:paddingLeft="40dp"
tools:context=".MainActivity" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="39dp"
android:gravity="center_vertical" >
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="knap"
android:id="@+id/knap"
android:background="#99D6D6"/>
</LinearLayout>
答案 0 :(得分:2)
您应该将Button添加到xml上的已定义布局中。首先,你的xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:clickable="true"
android:orientation="vertical"
android:paddingLeft="40dp"
tools:context=".MainActivity" >
<LinearLayout
android:id="@+id/linearLayout"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
</LinearLayout>
</LinearLayout>
然后在您的java代码中,您应该使用ID为 linearLayout 的LinearLayout
,将Button添加到该布局中,如下所示:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
panel1.add("1");
panel1.add("2");
LinearLayout l = (LinearLayout) findViewById(R.id.linearLayout);
for(String s : panel1){
Button newButton = new Button(this);
newButton.setText(panel1.get(i));
newButton.setBackgroundColor(0xFF99D6D6);
l.addView(newButton);
}
}
答案 1 :(得分:0)
可能你会得到以下例外:
IllegalStateException:指定的子级已有父级。您必须先在孩子的父母身上调用removeView()。
由于knap
按钮已在linearLayout1
布局中,并且您尝试使用l.addView(knap);
行在同一布局中再次添加它。因此无法在布局
答案 2 :(得分:0)
原因很简单
Button knap = (Button) findViewById(R.id.knap);
这样你就具有约束力了#34; knap&#34;按钮到XML布局中定义的特定ID。基本上,无论你经过多少循环周期,它总是相同的Button,因为ID永远不会改变(根据定义,ID不能改变)。
Button knap = new Button(this);
这样,您可以创建Button变量的全新实例。它不受任何限制,没有任何类型的参数(包括ID)。
这是一种可以动态添加到布局视图组的视图。
To&#34; import&#34;来自定义的XML项的值,您始终可以复制LayoutParams。
Button dummyButton = (Button) findViewById(R.id.knap);
LayoutParams params = dummyButton.getLayoutParams();
Button myNewButton;
LinearLayout l = (LinearLayout) findViewById(R.id.linearLayout1);
for (String s : panel1) {
myNewButton = new Button(this);
myNewButton.setLayoutParams(params);
l.addView(myNewButton);
}
这样的事情。
请注意,您还需要在循环中声明Button和LinearLayout变量(就像我在上面的代码片段中所做的那样)。
此外,您的&#34;示例按钮&#34;以XML格式声明的内容将可见并添加到布局中。
要么注意到这一点(例如,在整个循环中跳过第一个视图,或者执行完整循环并将视图的可见性设置为GONE
dummyButton.setVisibility(View.GONE);
或通过XML
<Button android:id="+@id/knap"
android:visibility="gone" />
如果XML参数&#34; visibility =&#34;已经消失了,那么现在还不确定。 &#39;带有上面描述的LayoutParams。在这种情况下,你的循环会添加按钮,但它们不会是可见的。要解决它,
myNewButton.setVisibility(View.VISIBLE);
答案 3 :(得分:0)
如果要在布局的循环中添加按钮,则需要定义仅包含该按钮的布局资源文件。
然后在循环Button button = (Button) getLayoutInflater().inflate(R.layout.your_button_layout_file, l, false);
最后添加按钮以查看群组l.addView(button);