Пользовательские представления, добавленные в horizontal scrollview, не отображаются, когда scrollview больше экрана

#android #android-layout

#Android #android-макет

Вопрос:

Я действительно надеюсь, что вы сможете помочь! Я уже целую вечность бьюсь головой о стену.

Центр моего приложения состоит из линейного макета, разделенного на две части. Верхний макет представляет собой горизонтальный вид прокрутки. Этот вид прокрутки содержит относительный макет, который, в свою очередь, содержит вид «Линия» — просто линия поперек экрана.

Динамически я добавляю кнопки с изображениями в относительный макет по отношению к линии. Эти кнопки изображения соединены «Drawar», пользовательским классом просмотра. Это просто создает линию, проходящую через кнопки.

Все работает нормально, пока вид прокрутки не станет «активированным», то есть добавленные кнопки изображений слишком велики по ширине для экрана. Затем «Линия» исчезает, и «Отводные линии» исчезают. Кнопки с изображением не исчезают. Я заметил, что onDraw в разделе «Drawar» не вызывается.

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

Применимый XML

 <LinearLayout 
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:orientation="vertical"
android:layout_toRightOf="@id/ScrollVertical"
android:weightSum="100"
android:baselineAligned="false">

    <HorizontalScrollView
        android:id="@ id/scrollHorizontal"
        android:layout_width="match_parent"
        android:layout_height="0dip"
        android:fillViewport="true"
        android:layout_weight="85"
        android:layout_gravity="center">

            <RelativeLayout
                android:id="@ id/actionFrame"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_gravity="left">

                    <View
                        android:id="@ id/theLine"
                        android:layout_width="match_parent"
                        android:layout_height="2dip"
                        android:layout_centerInParent="true"
                        android:background="@drawable/linegradient"
                        android:padding="0dp">
                    </View> 

            </RelativeLayout>

    </HorizontalScrollView>     
 

Java Draw Стрелка

 public DrawArrow(Context context, View startView, View endView) {
    super(context);   
    paint.setStrokeWidth(5);
    paint.setStyle(Paint.Style.STROKE); 
    start = startView;
    end = endView;
}

public void onDraw(Canvas canvas) {

    paint.setColor(Color.BLACK);     
    canvas.drawLine(start.getX()   (start.getWidth()/2), start.getY()  (start.getHeight()/2), end.getX()   (end.getWidth()/2), end.getY()   (end.getHeight()/2), paint);
}   
 

Java (где добавляются кнопки / соединения)

 RelativeLayout container = (RelativeLayout) findViewById(R.id.actionFrame);
//Create button
container.addView(button);

DrawArrow connArr = new DrawArrow(this, findViewById(instruction.getPred().getId()), findViewById(currentPosition));  //Instruction is connected with button - they share an ID
container.addView(connArr);
}
 

Примечание: Кнопка, в зависимости от того, является ли она первой или> первой добавленной, имеет разные параметры макета.

Все они являются WRAP_CONTENT , либо ALIGN_TOP / ALIGN_BOTTOM до «линии» и, если сначала, ALIGN_PARENT_LEFT, или если> сначала, СПРАВА от предыдущей кнопки.

Ответ №1:

На случай, если у кого-нибудь возникнет эта проблема —

Моя проблема заключалась в том, что я не переопределил метод onMeasure в Drawar, поэтому, как только родительский макет изменил размер, из-за прокрутки Drawar добавлялся с шириной 0.

Все, что мне нужно было сделать, это передать родительский макет Drawar в его конструкторе, а затем в onMeasure установить значение measureddimension() для родительской ширины и размера.