Как динамически добавлять кнопки в ScrollView

Мне трудно динамически добавлять кнопки в ScrollView. В приведенном ниже коде добавляются кнопки, НО нет скроллера. Если я помещаю кнопки непосредственно в XML (не динамически), он работает, и я могу прокручивать вниз / вверх.

Мой взгляд:

<ScrollView android:id="@+id/ScrollView01"
android:layout_width="264dp"
android:layout_height="match_parent"
android:fillViewport="true"
>

    <LinearLayout
        android:id="@+id/buttons"
        android:layout_width="264dp"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:scrollbars="vertical"
         >         

     ** HERE THE BUTTONS SHOULD BE ADDED DYNAMICALLY **     

    </LinearLayout>

</ScrollView>

Код, добавляющий кнопки:

    // create new button
    final Button newbutton = new Button(this);

    // set background color
    newbutton.setBackgroundColor(Color.GRAY);

    // set width and height
    newbutton.setWidth(50);
    newbutton.setHeight(20);

    // set position
    newbutton.setY(((float)numOfButton*20)+20);
    newbutton.setX(100);

    // set text
    newbutton.setText(Integer.toString(numOfButton));

    // create patameter
    final LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(
            LayoutParams.WRAP_CONTENT,
            LayoutParams.WRAP_CONTENT
            );

    //set listener
    android.view.View.OnClickListener buttonListener = new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            // make all the DrawView invisible
            for(View view : comments){
                view.setVisibility(View.INVISIBLE);
            }

            // set the chosen comment visible
            comments.get(numOfButton).setVisibility(View.VISIBLE);

            boardsHandler.setCurrenBoard(numOfButton);
        }};

        newbutton.setOnClickListener(buttonListener);

        // creating a thread to add button
        buttons.post(new Runnable() { 
            @Override
            public void run() {
                buttons.addView(newbutton, p);
            }
        });

Это что-то с LinearLayout.LayoutParams p?

Спасибо!


person etaiso    schedule 05.05.2013    source источник
comment
взгляните на следующие ссылки. stackoverflow.com/questions/6081685/ http://stackoverflow.com/questions/1998483/listview-dynamic-add-item.   -  person Ayush    schedule 05.05.2013
comment
@Ayush Как эти ссылки связаны с моей проблемой? Я могу добавлять кнопки динамически, но моя проблема в том, что у меня нет скроллера для прокрутки вверх / вниз.   -  person etaiso    schedule 05.05.2013


Ответы (3)


Сначала попробуйте следующий код

LinearLayout myContainer = findViewById(R.id.layoutId);

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

LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT, 
LinearLayout.LayoutParams.FILL_PARENT);

наконец, добавьте кнопку, как вы это делаете.

попробуй и скажи, работает ли это

person karan    schedule 05.05.2013
comment
Я не уверен, куда добавить первую написанную вами строчку. Как видите, у меня уже есть LinearLayout внутри ScrollView. - person etaiso; 05.05.2013
comment
вы можете добавить его в oncreate (), но если вы выполняете определенную задачу onclick (), используйте его там - person karan; 05.05.2013
comment
etaiso уже использует переменную buttons для LinearLayout, поэтому это кажется избыточным. Кроме того, ID - R.id.buttons, согласно файлу макета. - person Ridcully; 05.05.2013
comment
Так какова цель myContainer? Где мне это использовать? - person etaiso; 05.05.2013
comment
@etaiso это просто укажет на ваш контейнер. это упростит работу, и вам не нужно их запоминать. - person karan; 05.05.2013

Установка положения X и Y не работает. Макеты LinearLayout размещают дочерние элементы по вертикали или горизонтали, принимая во внимание только их ширину / высоту.

Помимо этого - пробовали ли вы позвонить buttons.invalidate() после buttons.addView(...)? Это должно обновить макет и отобразить вашу новую кнопку.

person Ridcully    schedule 05.05.2013
comment
На самом деле это работает .. Каждая кнопка добавляется в нужное время. Позиционирование также хорошее, несмотря на то, что оно выходит за нижнюю границу, когда на экране нет места - это то, чего я пытаюсь достичь с помощью ScrollView. - person etaiso; 05.05.2013
comment
Ой, извините, я немного не прочитал ваш вопрос. Я так понял, что кнопки не отображаются. Но, возможно, вам все же следует попробовать вызвать invalidate(), поскольку он пересчитает размер LinearLayout, и это, наконец, должно также сообщить представлению прокрутки, когда его дочернему элементу требуется прокрутка. - person Ridcully; 05.05.2013
comment
Итак, когда мне следует позвонить invalidate() и из какой точки зрения? Приведенный выше код относится к классу, который расширяет Activity ... Но если кнопки отображаются, зачем нужен invalidate ()? Спасибо за помощь. - person etaiso; 05.05.2013
comment
Как я уже сказал, вызывайте button.invalidate () сразу после button.addView (...). Не уверен, поможет ли это, но попробовать стоит. - person Ridcully; 06.05.2013

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

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

buttons.getLayoutParams().height = numOfButton*20+40;

после

buttons.addView(newbutton, p);

может помочь, хотя, вероятно, это не лучшее решение. Я думал, что моя ошибка вообще связана с использованием RelativeLayout, но поскольку у вас, похоже, такая же проблема ... Вы когда-нибудь думали об использовании макета таблицы?

person Murc    schedule 23.07.2013