Android Crear el botón dinámicamente y rellenar el diseño

Estoy creando un botón dinámicamente. El número de botón depende del tamaño de arraylist. El problema es, después de crear el botón voy a añadir a la distribución mediante el método addview. El problema es que estoy usando el diseño lineal, ya que la orientación por defecto para el diseño lineal es horizontal, por lo que el botón llenará el diseño horizontalmente. Debido a que algunos de los botones no es visible. Lo que estoy tratando de lograr es algo parecido a esto

Botón múltiple en android mensaje contacto

Mi código es como a continuación:

Button[] tv = new Button[arraylist.size()]; for(int i=0;i<arraylist.size();i++){ tv[i] = new Button(getApplicationContext()); tv[i].setText(arraylist.get(i).toString()); tv[i].setTextColor(Color.parseColor("#000000")); tv[i].setTextSize(20); tv[i].setPadding(15, 5, 15, 5); linearlayout.addView(tv[i]); } 

Si establezco la orientación del diseño lineal en vertical, el botón se llenará verticalmente. Así que si hay alguna solución para crear el botón de forma dinámica y llenar el diseño horizontal y vertical como se muestra por la imagen.

No hay una disposición enlatada en el SDK que hace exactamente lo que usted está apuntando (es decir, dispones de tantos niños horizontalmente como se ajuste, luego fluir a la siguiente línea para disponer un poco más), por lo que tendrá que crear una costumbre ViewGroup que cumple este objetivo. Afortunadamente para ti, Romain Guy creó una en vivo en pantalla durante una presentación en Devoxx.

Aquí hay un enlace a ese vídeo de presentación .

Aquí hay un enlace al código de ejemplo y diapositivas .

HTH

Después de 2 días luchando pensando combate este problema finalmente he encontrado la solución. He intentado poner toda mi lista de contactos, almacenarla en arraylist y crear un botón para cada elemento y estoy bastante satisfecho con el resultado después de mostrar en la pantalla. Aquí es cómo hago el truco. Realmente aprecio para cualquier comentario de otros.

Declaración de variables;

 int currWidth; int currCounter; boolean isNewLine; LinkedList<HashMap<String,Object>> button; ArrayList<String> nameNumber = new ArrayList<String>(); contactWrapper = (LinearLayout) findViewById(R.id.multiple_selection); 

Crear botón evento onClick;

 for(int i=0;i<nameNumber.size();i++){ tv[i] = new Button(getApplicationContext()); String[] namePhone = nameNumber.get(i).toString().split("@@"); phoneNumber.add(namePhone[1]); tv[i].setText(namePhone[0]); tv[i].setTag(namePhone[1]); tv[i].setTextColor(Color.parseColor("#000000")); tv[i].setTextSize(20); tv[i].setPadding(15, 5, 15, 5); tv[i].measure(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); HashMap<String, Object> map = new HashMap<String,Object>(); map.put("button", tv[i]); map.put("width", tv[i].getMeasuredWidth()); button.add(map); } drawLayout(); 

El método drawlayout es donde agrego el botón y arreglo por consiguiente para caber la disposición;

 public void drawLayout(){ int counter=0; contactWrapper.setOrientation(LinearLayout.VERTICAL); currCounter=0; currWidth=0; isNewLine=false; LinearLayout[] row = new LinearLayout[nameNumber.size()]; row[currCounter] = new LinearLayout(getApplicationContext()); @SuppressWarnings("rawtypes") Iterator it = button.iterator(); for(int i = 0; i<button.size(); i++){ it.next(); row[currCounter].setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT)); currWidth += Integer.parseInt(button.get(i).get("width").toString()); if(isNewLine){ if(currWidth < contactWrapper.getWidth()){ row[currCounter].addView((View) button.get(i).get("button")); if(!it.hasNext()){ contactWrapper.addView(row[currCounter]); }else{ if(contactWrapper.getWidth()<(currWidth+Integer.parseInt(button.get(i+1).get("width").toString()))){ isNewLine=true; contactWrapper.addView(row[currCounter]); currCounter+=1; row[currCounter] = new LinearLayout(getApplicationContext()); currWidth=0; }else{ isNewLine=false; } } }else{ isNewLine=true; contactWrapper.addView(row[currCounter]); currCounter+=1; row[currCounter] = new LinearLayout(getApplicationContext()); currWidth=0; } }else{ if(currWidth < contactWrapper.getWidth()){ if(!it.hasNext()){ row[currCounter].addView((View) button.get(i).get("button")); contactWrapper.addView(row[currCounter]); }else{ row[currCounter].addView((View) button.get(i).get("button")); if(contactWrapper.getWidth()<(currWidth+Integer.parseInt(button.get(i+1).get("width").toString()))){ isNewLine=true; contactWrapper.addView(row[currCounter]); currCounter+=1; row[currCounter] = new LinearLayout(getApplicationContext()); currWidth=0; }else{ isNewLine=false; } } }else{ isNewLine=true; contactWrapper.addView(row[currCounter]); currCounter+=1; row[currCounter] = new LinearLayout(getApplicationContext()); currWidth=0; } } counter++; } } 

Este código bastante desordenado + No estoy completamente utilizar el tamaño de la matriz para

 LinearLayout[] row = new LinearLayout[nameNumber.size()]; 

Pero funciona para mí.

TableLayout lugar de LinearLayout esto es tutorial espero que esto le ayudará a obtener la idea

¿Establece android:layout_width="fill_parent" ? Haz esto si no lo haces.

Bueno, puedes intentar usar una manera más sofisticada. Puede crear un diseño lineal horizontal y agregar botones. Cada vez que intente agregar un nuevo botón, compruebe si hay lugar para él, encontrando la diferencia entre el diseño y los anchos de los botones.

Cada vez que se completa el diseño horizontal, se agrega a otro diseño vertical y se crea otro diseño horizontal para almacenar los botones a la izquierda.

Utilicé ese truco en mis aplicaciones.

Prueba esto está funcionando bien

This.row = (LinearLayout) findViewById (R.id.tags); This.row.setOrientation (LinearLayout.VERTICAL); LinearLayout one = new LinearLayout (this);

  //get the size of the screen Display display = getWindowManager().getDefaultDisplay(); this.screenWidth = display.getWidth(); // deprecated this.screenHeight = display.getHeight();// depreceted for(int i=0; i<6; i++) { one.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); this.button = new Button(this); button.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); if(i==0) { this.button.setText("Muhammad Aamir"); } else if(i==1) { this.button.setText("Ahsan"); } else if(i==2) { this.button.setText("Mujahid"); } else if(i==3) { this.button.setText("Waqas"); } else if(i==4) { this.button.setText("Ali"); } else { this.button.setText("Ahmer"); } //get the size of the button text Paint mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setTextSize(button.getTextSize()); mPaint.setTypeface(Typeface.create(Typeface.SERIF, Typeface.NORMAL)); float size = mPaint.measureText(button.getText().toString(), 0, button.getText().toString().length()); size = size+14; this.totalTextWidth += size; if(totalTextWidth < screenWidth) { one.addView(button); } else { this.row.addView(one); one = new LinearLayout(this); one.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); one.addView(button); this.totalTextWidth = size; } } this.row.addView(one); } 
  • Cómo obtener contenido html desde una webview?
  • Android Cómo ajustar el diseño en el modo de pantalla completa cuando el teclado virtual está visible
  • Cómo deshabilitar el botón positivo de un AlertDialog durante el tiempo de ejecución?
  • ¿Cómo dar dos enlaces para móviles y tabletas en la vista web?
  • Diseño de widget Android - fondo negro predeterminado
  • Anulación del estilo de lista desplegable para Spinner en el modo de diálogo
  • Adición de enums al adaptador de matriz para Spinner en Android
  • Cómo configurar una imagen de mapa de bits en el lienzo de mi vista personalizada?
  • Prevenga la tecla 'Enter' para activar TextWatcher
  • ¿Cómo evitar la pantalla en negro en Android mientras mi aplicación se está cargando?
  • Android Appcompat v21 - utilizar el estilo antiguo del hilandero
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.