使用循环向android布局添加按钮

时间:2015-02-10 07:54:20

标签: android loops button

我正在尝试使用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>

4 个答案:

答案 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);