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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/11710200/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 08:32:56  来源:igfitidea点击:

Android: programmatically adding buttons to a layout

androidandroid-layout

提问by bluej

I'm trying to get an add button to add another button to the layout, based on the edittext to the left of the button. The point is for a person to list the rooms in their house, and then when they type in each room, a new button is generated so they can click the room, and then start working on the next page.

我正在尝试根据按钮左侧的编辑文本获取一个添加按钮以将另一个按钮添加到布局中。关键是让一个人列出他们家中的房间,然后当他们在每个房间中输入时,会生成一个新按钮,以便他们可以单击房间,然后开始在下一页上工作。

I had an xml layout all done, and then I realized I'm "programmatically" adding buttons, so I redid the layout programmatically, and then in the switch/case (that's how I do onclicks) for the add button I tried to add a button to the view, but it's getting very tricky. I'd like to have a scrollview below the edittext and add buttons, and as they add all the rooms to their house it eventually is populated with a scrollable list of buttons for their entire home. Is there a way to add buttons programmatically to an xml'd layout. I was thinking you can but everything I'm trying just isn't working.

我完成了一个 xml 布局,然后我意识到我是“以编程方式”添加按钮,所以我以编程方式重新布局,然后在我尝试添加的添加按钮的开关/案例中(这就是我所做的点击)视图的按钮,但它变得非常棘手。我想在编辑文本下方有一个滚动视图并添加按钮,当他们将所有房间添加到他们的房子时,它最终会填充他们整个家的可滚动按钮列表。有没有办法以编程方式将按钮添加到 xml 布局。我以为你可以,但我正在尝试的一切都不起作用。

Thanks for your help everybody, any recommendations you have would be greatly appreciated.

感谢大家的帮助,您的任何建议将不胜感激。

First Edit (in response to Tanuj's solution)

第一次编辑(响应 Tanuj 的解决方案)

My XML file (not sure if we're going to use this or just use the java):

我的 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>

And the Java. This isn't at all correct, as in the java I'm creating the whole layout instead of using the layout above. Just not sure if I can bridge the two.

还有爪哇。这一点都不正确,因为在 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;
    }

}
}

回答by Tanuj Wadhwa

Try this :

尝试这个 :

    //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);

回答by Mr.Sandy

Try this code:

试试这个代码:

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

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
     }
}

that is a way to create button dynamically and add in Layout.

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

remember that when you create button programmatically you just use thisnot Class_name.this

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

回答by Durul Dalkanat

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);
    }
}

回答by devmiles.com

I would add an id to your LinearLayout in xml:

我会在 xml 中为您的 LinearLayout 添加一个 id:

<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" >

And then change your onClick to this:

然后将您的 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;
    }
}

回答by dwadeuk3

Each button needs to have an onclicklistener to tell it what to do. this can be added to your java code under where you state your button.

每个按钮都需要有一个 onclicklistener 来告诉它要做什么。这可以添加到您声明按钮的 Java 代码中。

Button createdButton = new Button(this);
createdButton.setOnClickListener(new OnClickListener()
{

code you want implemented

}