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
- Depuración del código de widgets de Android en Eclipse
- No se llama al método WebView: WebViewClient.onPageStarted
- Implementación de OnClickListener para los botones creados dinámicamente en Android
- ¿Cómo puedo convertir la cadena de const valor de clase int?
- ¿Hay algún ejemplo sobre el texto Spanned y Spannable?
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.
- Cómo actualizar un widget con precisión cada minuto
- ¿Es posible definir el comportamiento / el diseño del widget para cambiar el tamaño y el cambio de orientación en los lanzadores de terceros?
- Obtener elementos seleccionados de ListView con casilla de verificación
- Prueba de Android si el elemento de interfaz de usuario / vista existe
- Android: AppWidget con la vista personalizada no funciona
- RemoteViews para la actualización de widget supera el error máximo de uso de memoria de mapa de bits
- Ejemplo de un elemento spinner personalizado setDropDownViewResource
- Cómo utilizar setBackground con un Widget de Android
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); }
- Reemplazar cada palabra con etiqueta
- PhoneGap / JQuery Mobile – El estilo de página se rompe cuando el teclado está visible