Оберните макет с текстовыми изображениями
У меня есть макет, который выглядит так:
<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 добавляется. Аналогично, на основе доступного пространства экрана, я хочу добавить количество текстовых просмотров в макет.
Как это может быть достигнуто программным путем?
![введите описание изображения здесь]()
Ответы
Ответ 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
, поэтому он перестает добавлять строки и представления строк при достижении максимальной высоты, а затем добавляет ваше представление, которое отображает количество скрытых просмотров