Горизонтальный вид прокрутки расширяется при программном добавлении представлений

#android #android-linearlayout #android-custom-view #horizontalscrollview

#Android #android-linearlayout #android-пользовательский вид #horizontalscrollview

Вопрос:

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

Вот как выглядит представление до Изображение 1

Затем я добавляю представление в вид прокрутки после события перетаскивания:

 MemoNodeView mn = new MemoNodeView(this);
mn.setMemo(m);
int time = (int) Math.round(pixelsPerMilliSecond()*m.getTimeLength());
mn.setMemoSize(time, timelineHeight);
timeline.addView(mn, new ViewGroup.MarginLayoutParams(time, timelineHeight));
  

Это приводит к увеличению размера представления по вертикали:
введите описание изображения здесь

Я попытался исправить это, повторно установив параметры компоновки линейного макета внутри вида прокрутки на основе высоты, которую он должен был иметь:

 ViewGroup.LayoutParams p = timeline.getLayoutParams();
p.height = timelineHeight;
timeline.setLayoutParams(p);
  

Что приводит к такой ситуации, когда вид прокрутки по-прежнему расширяется, но содержимое имеет правильный размер:
введите описание изображения здесь

Затем я попытался изменить размер самого вида прокрутки, чтобы размер соответствовал тому, что он должен был:

 ViewGroup.LayoutParams p2 = timelineScrollView.getLayoutParams();
p2.height = timelineHeight;
timelineScrollView.setLayoutParams(p2);
  

что дало:
введите описание изображения здесь

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

XML для области выглядит следующим образом (обратите внимание, что цвета / текстовые представления являются заполнителями, используемыми для того, чтобы попытаться визуально выделить проблему):

 `<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/black_frame"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:background="#ffffff" >

        <TextView
            android:id="@ id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="Small Text" />
    </LinearLayout>

    <LinearLayout
        android:id="@ id/LinearLayout1"
        android:layout_width="match_parent"
        android:layout_height="0dip"
        android:layout_weight="3"
        android:orientation="vertical"
        android:paddingLeft="@dimen/toggle_draw_padding"
        android:paddingRight="@dimen/toggle_draw_padding" >


        <HorizontalScrollView
            android:id="@ id/horizontal_scroll_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@drawable/timeline_dots_bitmap" 
            android:fillViewport="true">

            <LinearLayout
                android:id="@ id/timeline_view"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:orientation="horizontal"
                android:background="#F0AA4444" >
            </LinearLayout>
        </HorizontalScrollView>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:background="#ffffff" >

        <TextView
            android:id="@ id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="Small Text" />
    </LinearLayout>
</LinearLayout>`
  

Есть идеи относительно того, что я здесь делаю не так?

Ответ №1:

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

Линейные макеты с белым фоном имели layout_height="match_parent" странное поведение при добавлении других представлений. Изменение двух макетов на layout_height="0dip" решение проблемы. Как показано ниже:

`

     <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dip"
        android:layout_weight="1"
        android:background="#ffffff" >

        <TextView
            android:id="@ id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="Small Text" />
    </LinearLayout>

    <LinearLayout
        android:id="@ id/LinearLayout1"
        android:layout_width="match_parent"
        android:layout_height="0dip"
        android:layout_weight="3"
        android:orientation="vertical"
        android:paddingLeft="@dimen/toggle_draw_padding"
        android:paddingRight="@dimen/toggle_draw_padding" 
        >


        <HorizontalScrollView
            android:id="@ id/horizontal_scroll_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@drawable/timeline_dots_bitmap" 
            android:fillViewport="true"
            android:layout_margin="0dip"
            android:padding="0dip">

            <LinearLayout
                android:id="@ id/timeline_view"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:orientation="horizontal"
                android:background="#F0AA4444" 
                android:layout_margin="0dip"
                android:padding="0dip">
            </LinearLayout>
        </HorizontalScrollView>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dip"
        android:layout_weight="1"
        android:background="#ffffff" >

        <TextView
            android:id="@ id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="Small Text" />
    </LinearLayout>
</LinearLayout>`
  

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