Android: 以编程方式向布局添加按钮

27
我正在尝试添加一个“添加”按钮,以便根据按钮左侧的编辑文本向布局中添加另一个按钮。目的是让人们列出他们房子里的房间,然后在输入每个房间时生成一个新的按钮,这样他们就可以单击该房间,然后开始工作在下一页上。
我已经完成了一个XML布局,然后我意识到我正在“以编程方式”添加按钮,所以我重新以编程方式制作了布局,然后在switch/case(这是我做onclicks的方式)中尝试添加按钮到视图中,但这变得非常棘手。我想在编辑文本和添加按钮下面有一个滚动视图,并且随着他们将所有房间添加到他们的房子中,它最终会填充一个可滚动的按钮列表,用于他们整个家庭。是否有一种方法可以以编程方式将按钮添加到XML布局中。我想你可以,但是我尝试的所有内容都不起作用。
感谢大家的帮助,非常感谢您提供的任何建议。
第一次编辑(响应Tanuj的解决方案)
我的XML文件(不确定我们是否要使用此文件还是仅使用Java):
 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:orientation="vertical" >

<TextView
    android:id="@+id/tvAddARoom"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/tvAddARoom" />

<EditText
    android:id="@+id/etAddARoom"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="@string/etAddARoom" />


<Button
    android:id="@+id/btnAddARoom"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/btnAdd" />

<TextView
    android:id="@+id/tvSelectARoom"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/tvSelectARoom" />

<TextView
    android:id="@+id/tvNoRooms"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/tvNoRooms" />

<Button
    android:id="@+id/btnViewAll"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/btnViewAll" />

 </LinearLayout>

关于 Java。这并不完全正确,因为在我创建的 Java 中,我正在创建整个布局而不是使用上面的布局。我不确定是否可以将两者联系起来。

package com.bluej.movingbuddy;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
//import android.widget.ScrollView;
import android.widget.TextView;

public class EstimatorByRoom extends Activity implements OnClickListener {
String roomName;
EditText etAddARoom;
LinearLayout layout;
LinearLayout.LayoutParams layoutParam;


@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    //setContentView(R.layout.estimatorbyroom);

    LayoutParams params = 
            new LinearLayout.LayoutParams(
                    LayoutParams.FILL_PARENT,
                    LayoutParams.WRAP_CONTENT);

    //create a layout
    LinearLayout layout = new LinearLayout(this);
    layout.setOrientation(LinearLayout.VERTICAL);

    //create a text view
    TextView tvAddARoom = new TextView(this);
    tvAddARoom.setText("Add a Room");
    tvAddARoom.setLayoutParams(params);

    //create an edittext
    EditText etAddARoom = new EditText(this);
    etAddARoom.setHint("Living Room, Dining Room, etc.");
    etAddARoom.setLayoutParams(params);


    //create a button
    Button btnAddARoom = new Button(this);
    btnAddARoom.setText("Add");
    btnAddARoom.setLayoutParams(params);

    //adds the textview
    layout.addView(tvAddARoom);

    //add the edittext
    layout.addView(etAddARoom);
    //add the button
    layout.addView(btnAddARoom);

    //create the layout param for the layout
    LinearLayout.LayoutParams layoutParam = new LinearLayout.LayoutParams(
            LayoutParams.FILL_PARENT,
            LayoutParams.WRAP_CONTENT);

    this.addContentView(layout, layoutParam);
}

public void onClick(View v) {
    // TODO Auto-generated method stub
    switch (v.getId()) {

    case R.id.btnAddARoom:
        //add a room

        //this part isn't working!
        roomName = etAddARoom.getText().toString();
        Button createdButton = new Button(this);
        createdButton.setText(roomName);
        layout.addView(createdButton);
        this.addContentView(layout, layoutParam);

        //if no rooms make tvnorooms disappear

        break;
    }

}
}
5个回答

41

试试这个:

    //the layout on which you are working
    LinearLayout layout = (LinearLayout) findViewById(R.id.linear_layout_tags);

    //set the properties for button
    Button btnTag = new Button(this);
    btnTag.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    btnTag.setText("Button");
    btnTag.setId(some_random_id);

    //add button to the layout
    layout.addView(btnTag);

尝试移除 this.addContentView(layout, layoutParam); - Tanuj Wadhwa
这可能会有所帮助:https://dev59.com/vVLTa4cB1Zd3GeqPXyYF - Tanuj Wadhwa

12

尝试使用这段代码:

LinearLayout l_layout = (LinearLayout) findViewById(R.id.linear_layout); 
l_layout.setOrientation(LinearLayout.VERTICAL); // or HORIZONTAL

Button btn1 = new Button(this);
btn1.setText("Button_text");

l_layout.addView(btn1);

btn1.setOnClickListener(new OnClickListener() {
     @Override
     public void onClick(View v) {
           // put code on click operation
     }
});

这是一种动态创建按钮并添加到布局中的方法。

请记住,当您以编程方式创建按钮时,只需使用this而不是Class_name.this


4
public class AndroidWalkthroughApp1 extends Activity implements View.OnClickListener {

    final int TOP_ID = 3;
    final int BOTTOM_ID = 4;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // create two layouts to hold buttons
        LinearLayout top = new LinearLayout(this);
        top.setId(TOP_ID);
        LinearLayout bottom = new LinearLayout(this);
        bottom.setId(BOTTOM_ID);

        // create buttons in a loop
        for (int i = 0; i < 2; i++) {
            Button button = new Button(this);
            button.setText("Button " + i);
            // R.id won't be generated for us, so we need to create one
            button.setId(i);

            // add our event handler (less memory than an anonymous inner class)
            button.setOnClickListener(this);

            // add generated button to view
            if (i == 0) {
                top.addView(button);
            }
            else {
                bottom.addView(button);
            }
        }

        // add generated layouts to root layout view
        LinearLayout root = (LinearLayout)this.findViewById(R.id.root_layout);
        root.addView(top);
        root.addView(bottom);
    }

    @Override
    public void onClick(View v) {
        // show a message with the button's ID
        Toast toast = Toast.makeText(AndroidWalkthroughApp1.this, "You clicked button " + v.getId(), Toast.LENGTH_LONG);
        toast.show();

        // get the parent layout and remove the clicked button
        LinearLayout parentLayout = (LinearLayout)v.getParent();
        parentLayout.removeView(v);
    }
}

3

I would add an id to your LinearLayout in xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@id/llContainer"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical" >

然后将你的onClick更改为以下内容:
public void onClick(View v) {
    switch (v.getId()) {

    case R.id.btnAddARoom:
        //add a room
        //Find you parent layout which we'll be adding your button to:
        LinearLayout layout = (LinearLayout) findViewById(R.id.llContainer);

        roomName = etAddARoom.getText().toString();
        Button createdButton = new Button(this);
        createdButton.setText(roomName);
        createdButton.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,         LayoutParams.WRAP_CONTENT));
        layout.addView(createdButton);

        //if no rooms make tvnorooms disappear

        break;
    }
}

Vladimir,感谢您的查看。我尝试了您上面提供的方法,我同意您的想法,但是当按下添加按钮时,应用程序似乎没有做任何事情。还有其他想法吗?我们错过了什么? - bluej
onClick事件是否触发?在那里添加一个日志输出来找出答案。或者在onClick方法内设置断点并进行调试。 我会创建一个专门用于此按钮的点击监听器,因此无需使用switch语句。 - devmiles.com
好的,我尝试做一个日志,但这像核爆一样炸了,所以我显然不知道如何做日志。因此,我想到了一种新的方法。我考虑当我点击添加时,不是创建一个按钮,而是将房间添加到SQLite数据库中的房间表中。然后,我将查询SQLite数据库并根据数据库中的数据创建按钮。如果有房间,它会给我按钮,如果没有房间,它会说“没有房间”。 - bluej

3
每个按钮都需要一个onclicklistener来告诉它该做什么。这可以在您声明按钮的位置下添加到您的Java代码中。
Button createdButton = new Button(this);
createdButton.setOnClickListener(new OnClickListener()
{

code you want implemented

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接