¿Cómo crear un botón dinámicamente?

Sé que mucha gente ha preguntado sobre esto, pero mi pregunta tiene una diferencia:

Ya tengo un layout en xml (usando pestañas), pero necesito crear botones de acuerdo a la lectura de una cadena.

Por ejemplo: La consulta devuelve cuatro palabras. Necesito crear cuatro botones, que al hacer clic en aparecer un brindis con la palabra.

Atención: No sé cuántas palabras encontrarán.

El código sería algo así como:

while (Content.indexOf("<glossary>") != -1) { Content = Content.substring(Content.indexOf("<glossary>") + 9); //create button with name "Content" } 

Editar:

Mira mi nuevo código para crear sólo un botón:

  public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.showphyto); intent = getIntent(); Title = intent.getStringExtra("Title"); Content = intent.getStringExtra("Content"); setTitle(Title); //if(getIntent().getData().getQueryParameter("author") != null) TabSpec descritor; /************************** Tab General **************************/ descritor = getTabHost().newTabSpec("tag1"); descritor.setContent(R.id.General); Button myButton = new Button(ShowAllegationActivity.this); myButton.setText("test"); LinearLayout myContainer = (LinearLayout) findViewById(R.id.General); myContainer.addView(myButton); descritor.setIndicator("General", getResources().getDrawable(R.drawable.icon)); getTabHost().addTab(descritor); /************************** Tab 2 **************************/ descritor = getTabHost().newTabSpec("tag2"); descritor.setContent(R.id.Recipe); Teste = (TextView) findViewById(R.id.teste2); Teste.setText("Teste2"); descritor.setIndicator("Tab2", getResources().getDrawable(R.drawable.icon)); getTabHost().addTab(descritor); /************************** Tab3 3 **************************/ descritor = getTabHost().newTabSpec("tag3"); descritor.setContent(R.id.Related); Teste = (TextView) findViewById(R.id.teste3); Teste.setText("Teste3"); descritor.setIndicator("Tab3", getResources().getDrawable(R.drawable.icon)); getTabHost().addTab(descritor); getTabHost().setCurrentTab(0); } 

}

Archivo xml:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TabHost android:id="@android:id/tabhost" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:id="@+id/linearLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <TabWidget android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@android:id/tabs"></TabWidget> <FrameLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@android:id/tabcontent"> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/General"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/teste" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/General2"> </LinearLayout> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/Recipe"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/teste2" /> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/Related"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/teste3" /> </LinearLayout> </FrameLayout> </LinearLayout> </TabHost> 

Puede crear un botón en código con:

 Button myButton = new Button(); myButton.setLayoutParams(myLayoutParams); myButton.setText(myText); 

Para que se muestre el Toast, agregue un onClickListener:

 myButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //The parameter view is the button that was clicked Toast.makeText(context, ((Button) view).getText(), Toast.LENGTH_LONG).show() //TypeCasting to Button is important, because a normal View doesn't have a getText method } }); 

Luego, para agregarlos a su pantalla, necesitará tener un contenedor definido en xml para mantenerlos, por ejemplo un LinearLayout. Consigue el LinearLayout con:

 LinearLayout myContainer = findViewById(R.id.myButtonId); //Make sure you set the android:id attribute in xml 

Es probable que desee que este código esté fuera de su bucle, tal vez justo antes de hacerlo, por lo que no obtiene el diseño en cada iteración.

Luego, en el bucle, después de configurar el botón:

 myContainer.addView(myButton); 

Finalmente, una nota sobre la variable myLayoutParams . Cuando establece parámetros para una vista, deben corresponder a la vista principal de su widget. Así que si está poniendo el botón en un LinearLayout se vería como

 //This will make LayoutParameters with layout_width="wrap_content" and layout_height="fill_parent" LinearLayout.LayoutParams myLayoutParams = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.FILL_PARENT); 

También puede poner esto fuera de su bucle, también, y reutilizarlo para cada botón.

Lo que podría hacer sería algo como esto:

  Button button = new Button(this); ViewGroup viewGroup = (ViewGroup) findViewById(R.id.container); viewGroup.addView(button); 

No sé su disposición así que no puedo conseguir más específico.

El ViewGroup sería su diseño y debería tener el id que encontraría findByViewId.

Además, usted tendría que colocar el botón que desea que sea.

  while (Content.indexOf("<glossary>") != -1) { Content = Content.substring(Content.indexOf("<glossary>") + 9); //create button with name "Content" Button b = new Button(this); b.setText(Content); // add this new view to your parent layout parent.addView(b); } 

Usted querrá incluir un diseño en su XML para mantener los botones que agrega (podría hacerlo dinámicamente, pero no parece necesario). Cuando quiera agregar un botón, encuentre ese diseño. A continuación, puede utilizar ViewGroup.addView (View child) para agregar sus botones a la jerarquía de vista.

También querrá decirle al sistema que el diseño ha cambiado, lo que puede hacer con el método View.invalidate ().

He cambiado la forma de crear pestañas y funcionó!

  • El estudio de Android de repente no puede resolver el símbolo R
  • actionBarSherlock subtítulo textSize
  • Altura de la vista de notificación de estado personalizado de Android
  • ¿La publicación de Runnable a un hilo de interfaz de usuario garantiza que el diseño esté terminado cuando se ejecuta?
  • estilo no se aplica
  • Cómo inflar XML-Layout-File correctamente dentro de Custom ViewGroup?
  • Diseño personalizado que redondea las esquinas de su contenido
  • Cambiar el color del icono de desbordamiento de la barra de herramientas
  • Cómo utilizar tabContentStart para iniciar el contenido desde la mitad de la pantalla del dispositivo
  • Obtener mensaje de error "El recurso no es público"
  • Android: inflar un diseño y escribirlo en PDF produce un PDF en blanco
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.