2012-07-29 23 views
7

Estoy tratando de obtener un botón Agregar para agregar otro botón al diseño, basado en el texto de edición a la izquierda del botón. El punto es que una persona haga una lista de las habitaciones de su casa, y luego cuando escriba en cada habitación, se genera un nuevo botón para que puedan hacer clic en la habitación y luego comenzar a trabajar en la página siguiente.Android: agregar botones mediante programación a un diseño

Tenía un diseño xml hecho, y luego me di cuenta de que estoy "programáticamente" agregando botones, así que redéjelos programáticamente y luego en el interruptor/caso (así es como hago los clics) para el botón agregar Traté de agregar un botón a la vista, pero se está poniendo muy complicado. Me gustaría tener una vista de desplazamiento debajo del texto de edición y agregar botones, y cuando agregan todas las habitaciones a su casa eventualmente se llena con una lista desplazable de botones para toda su casa. ¿Hay alguna manera de agregar botones programáticamente a un diseño xml'd? Estaba pensando que puedes, pero todo lo que estoy intentando simplemente no está funcionando.

Gracias por su ayuda a todos, cualquier recomendación que usted tenga será muy apreciada.

Primera Edición (en respuesta a la solución de Tanuj)

Mi archivo XML (no sé si vamos a utilizar este o simplemente utilizar el 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> 

Y el Java. Esto no es para nada correcto, ya que en Java estoy creando todo el diseño en lugar de usar el diseño anterior. Simplemente no estoy seguro si puedo unir los dos.

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

} 
} 

Respuesta

13

Prueba esto:

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

Prueba quitando 'this.addContentView (diseño, layoutParam);' –

+0

esto podría ayudar a http: // stackoverflow.com/questions/4269660/dynamically-adding-content-to-relativelayout –

3

Yo añadiría un id a su LinearLayout en 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" > 

Y luego cambia de onClick a esto:

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; 
    } 
} 
+0

Vladimir, gracias por echar un vistazo. Intenté lo que proporcionó anteriormente y estoy de acuerdo con su idea, pero la aplicación parece no hacer nada cuando se presiona el botón Agregar. ¿Alguna otra idea? ¿Qué nos estamos perdiendo? – bluej

+0

¿Aparece el sistema onClick? Agregue un resultado de registro allí para averiguarlo. O establecer un punto de interrupción dentro del método onClick y depurar. Crearía un oyente de clic dedicado a este botón, por lo que no es necesario usar la declaración de cambio. –

+0

Está bien, así que traté de hacer un registro, pero eso explotó esta cosa como una explosión nuclear, por lo que obviamente no tengo ni idea de cómo hacer el registro. Entonces, con eso, aunque pensé en una nueva forma de hacer esto. Estoy pensando que cuando haga clic en agregar que en lugar de crear un botón, voy a agregar la sala a una tabla de sala en una base de datos SQLite. Y luego voy a consultar la base de datos SQLite y crear botones basados ​​en los datos en la base de datos. Si hay habitaciones, entonces me dará botones, y si no hay habitaciones dirá "No hay habitaciones". – bluej

1

Cada botón debe tener un onclicklistener para decirme t qué hacer. esto se puede agregar a su código java en donde indica su botón.

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

code you want implemented 

} 
6

probar este código:

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

que es una manera de crear dinámicamente botón y añadir en Layout.

recuerda que cuando se crea botón de programación que acaba de utilizar este no Class_name.this

1
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); 
    } 
} 
Cuestiones relacionadas