Android Создание кнопки динамически и заполнить макет - PullRequest
4 голосов
/ 15 января 2012

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

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 ]

7 голосов
/ 15 января 2012

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

Вот ссылка на это презентационное видео .

Вот ссылка образец кода и слайды .

HTH

6 голосов
/ 18 января 2012

После 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);

событие кнопки createConClick;соответственно, чтобы соответствовать макету;

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 голосов
/ 01 мая 2013

попробуйте это работает нормально

this.row = (LinearLayout) findViewById (R.id.tags); this.row.setOrientation (LinearLayout.VERTICAL); LinearLayout one = новый 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);
}
0 голосов
/ 15 января 2012

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

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

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

0 голосов
/ 15 января 2012

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

0 голосов
/ 15 января 2012

используйте TableLayout вместо LinearLayout это учебник надеюсь, это поможет вам понять

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...