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

17

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

<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 добавляется. Аналогично, на основе доступного пространства экрана, я хочу добавить количество текстовых просмотров в макет.

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

    

задан Seshu Vinay 01.12.2015 в 06:50
источник
  • можете ли вы получить количество текстовых просмотров в FlowLayout? –  Sree 01.12.2015 в 06:52
  • или иначе вы поместите <FlowLayout> в scrollview. поэтому вам не нужно рассчитывать. –  KDeogharkar 01.12.2015 в 06:54
  • Я не хочу прокручивать раскладку потока. Как вы можете видеть на скриншоте выше, я хочу отображать как количество текстовых просмотров, как экран, и показать «+ остальное» в конце. –  Seshu Vinay 01.12.2015 в 06:58
  • Если это больший экран, я хочу показать все 5 текстовых просмотров вместо «+3», как на скриншоте. –  Seshu Vinay 01.12.2015 в 07:00
  • это явный вызов для пользовательского макета. измеряя доступные виды, пытаясь получить как можно больше, чтобы вписаться в него, и отобразить представление переполнения для остальных. вы, вероятно, не получите никаких хороших результатов, просто используя линейные макеты или аналогичные. –  David Medenjak 13.12.2015 в 22:16

3 ответа

2

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

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

    
ответ дан yedidyak 13.12.2015 в 14:48
9

Попробуйте программно добавить 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;
        }
    }
    
ответ дан CodeFury 10.12.2015 в 06:46
  • «скажем, вам нужно минимум 100 пикселей для каждого текстового просмотра» ... Ширина текста не фиксирована. все тексты имеют одинаковую длину. Тексты поступают из службы REST. Итак, если есть три текста длиной 2-3 символа, а затем 4-го числа, длина которых составляет 20 символов? –  Seshu Vinay 11.12.2015 в 07:40
2

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

Вот FlowLayout: Ссылка

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

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

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

    
ответ дан GregoryK 15.12.2015 в 15:29