Подтвердить что ты не робот

Оберните макет с текстовыми изображениями

У меня есть макет, который выглядит так:

<RelativeLayout>
<!--aligned parent top-->
</<RelativeLayout>
<FlowLayout>
<!--Should fill remaining space-->
</FlowLayout>
<RelativeLayout>
<!--aligned parent bottom-->
</<RelativeLayout>

Я использовал FlowLayout, чтобы отобразить список текстовых просмотров (он может содержать 10-15 текстовых просмотров). Итак, на основе свободного пустого пространства экрана, я хочу показать количество текстовых просмотров. Например, если там есть 15 текстовых просмотров, и на большом экране есть пространство для 10 текстовых просмотров, я хочу показать 9 текстовых просмотров и показать "+6" в последнем текстовом виде. В небольшом пространстве экрана может быть доступно только 5 текстовых просмотров, в том, что я хочу показать 4 текстовых просмотров с "+11" в последнем тексте. Для ясного понимания, вот скриншот. Как вы можете видеть, фактическое количество отображаемых текстовых просмотров - 5., но 2 отображаются, а +3 добавляется. Аналогично, на основе доступного пространства экрана, я хочу добавить количество текстовых просмотров в макет.

Как это может быть достигнуто программным путем?

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

4b9b3361

Ответ 1

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

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

Ответ 2

Попробуйте программно добавить TextViews в linearLayout в цикле for, в котором после добавления каждого textView получите оставшуюся ширину (можно вычислить с помощью [ScreenWidth- (сумма добавленной ширины текста + [no.of textviews * margin/padding для каждый])] *)

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

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

int screenWidth = getScreenWidth();
    int currentWidth=0;
    int minimumWidthForAChildWithOffset = 100;//offset should include width of indicator 
    int childCount = 10;
    int paddingForEachChild = 15;
    for (int i = 0; i <childCount; i++) {
        TextView label= getChildView();
        parent.addView(label, i);
        currentWidth += parent.getChildAt(i).getWidth() + paddingForEachChild;
        if(i!=childCount-1/*ignore if this is the last item*/ && screenWidth-currentWidth<=minimumWidthForAChildWithOffset){
            //add indicator label to layout here
            break;
        }
    }

Ответ 3

Если бы мне пришлось реализовать что-то вроде описанного, я попытался бы использовать fork/subclass FlowLayout и обновить его методы onMeasure и onLayout.

Здесь FlowLayout: https://github.com/blazsolar/FlowLayout/blob/develop/FlowLayout/src/main/java/com/wefika/flowlayout/FlowLayout.java

1) Первый шаг - ограничить высоту FlowLayout в onMeasure. Кроме того, может быть достаточно сделать что-то вроде этого:

<LinearLayout android:orientation="vertical" ... >
    <RelativeLayout ... />    
    <FlowLayout android:layout_height="0dp" android:layout_weight="1" ... />        
    <RelativeLayout ... />
</LinearLayout>

2) Второй шаг - обновить onLayout, поэтому он перестает добавлять строки и представления строк при достижении максимальной высоты, а затем добавляет ваше представление, которое отображает количество скрытых просмотров