4

Я создаю кнопку динамически. Количество кнопок зависит от размера arraylist. проблема в том, что после создания кнопки я добавлю в макет с помощью метода addview. Проблема в том, что я использую линейную компоновку, так как по умолчанию ориентация для линейного макета горизонтальная, поэтому кнопка будет заполнять макет горизонтально. Из-за этого некоторые кнопки не видны. То, что я пытаюсь достичь что-то похож на этотAndroid Создание кнопки динамически и заполнение макета

multiple button in android messaging contact

Мой код, как показано ниже:

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

Если установить ориентацию линейного расположения к вертикали кнопка будет заполнить вертикально. Поэтому, если есть какое-либо решение для создания кнопки динамически и заполнение макета как горизонтального, так и вертикального, как показано на изображении.

ответ

6

После 2 дней борьбы за размышление об этой проблеме, наконец, я нашел решение. Я попытался поместить весь свой список контактов, сохранить его в arraylist и создать кнопку для каждого элемента, и я вполне удовлетворен результатом после отображения на экране. Вот как я делаю трюк. Я очень ценю любые комментарии от других.

объявление переменной;

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

создать кнопку onClick event;

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

метод drawlayout, где я добавляю кнопку и располагаю соответствующим образом, чтобы соответствовать макету;

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

этот код довольно грязный + я не в полной мере использовать размер массива для

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

, но это работает для меня.

0

использование TableLayout вместо LinearLayout это tutorial надеюсь, что это поможет вам получить представление

+0

Форма обратной связи. Я попробовал это раньше, но он растягивает кнопку и отображение одной кнопки в строке. В моем случае я хочу обернуть текст кнопки. Таким образом, количество кнопок на каждой строке зависит от размера кнопки. – Zahary

0

набор ли вы android:layout_width="fill_parent"? Сделайте это, если вы этого не сделаете.

7

В SDK нет готового макета, который делает именно то, на что вы нацеливаетесь (то есть выкладываете как можно больше детей по горизонтали, а затем переходите к следующей строке, чтобы выложить еще немного), поэтому вам понадобится для создания пользовательского ViewGroup, который выполняет эту задачу. К счастью для вас, Ромен Гай создал один живой на экране во время презентации в Devoxx.

Вот ссылка на это presentation video.

Вот ссылка на sample code and slides.

HTH

0

Ну, вы можете попробовать использовать более сложный способ. Вы можете создать горизонтальную линейную компоновку и добавить к ней кнопки. Каждый раз, когда вы пытаетесь добавить новую кнопку, вы проверяете, есть ли место для нее, путем нахождения разницы между шириной макета и ширины кнопок.

Каждый раз, когда ваша горизонтальная компоновка заполняется, вы добавляете ее в другую вертикальную компоновку и создаете другую горизонтальную компоновку для хранения кнопок слева.

Я использовал этот трюк в своих приложениях.

+0

да ... Я тоже думаю об этом, к сожалению, я могу получить только ширину линейного макета. Для ширины кнопки нажмите 0, так как пользовательский интерфейс еще не был определен и выложен на экране, но вы можете предоставить мне образец кода для того, что вы сделали для приложений ur. – Zahary

0

попробовать этот оборотный штраф

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

//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); 
} 
Смежные вопросы