LINUX.ORG.RU

Android - разъезжается layout

 ,


0

1

Досталось приложение, которое нужно доделать. В LinearLayout(вертикальном, matchParent по обоим измерениям) расположены RelativeLayout с wrapContent по вертикали и ListView с MatchParent. Внутри RelativeLayout - webView с wrapContent, который может менять высоту(ссылки «читать дальше» и «свернуть»). До этого у верхнего блока тоже было matchParent, но на больших экранах это даёт много пустого места посередине. Сейчас почему-то, после разворачивания верхнего лейаута у него становится большая высота(больше размера экрана - проверял через measure) и при сворачивании исходная высота не восстанавливается, т.е. внизу остаётся пустой экран. Кто-нибудь сталкивался с подобным? Есть вариант замерять высоту в начале, а потом делать её фиксированной, но это костыль + почему-то некорректно сработало - слишком маленькая получается.

★★★★

LinearLayout в топку, юзай ТОЛЬКО RelativeLayout. Мач парент по высоте для заполнения всей высоты тоже не гуд идея, бед дизайн имхо.

Jetty ★★★★★ ()
Ответ на: комментарий от Stil

Потому что концепция построения лейаутов строится на отношении елементов, а не на статических характеристиках конктретньіх екранов.

Jetty ★★★★★ ()

вместо тысячи слов лучше скинь код лайаута.

kazufukurou ()
Ответ на: комментарий от Jetty

LinearLayout в топку, юзай ТОЛЬКО RelativeLayout.
Потому что концепция построения лейаутов строится на отношении елементов, а не на статических характеристиках конктретньіх екранов.

Расскажи как LinearLayout мешает строить лайауты?

F457 ★★★★ ()
Ответ на: комментарий от kazufukurou

В общем, решил сделать через костыль - меняю layoutParams с фиксированной высоты к matchParent при свертывании и наоборот.

positionText = getResources().getStringArray(R.array.text);
        String text = positionText[indexAuthor];
        if (msgView) text+="<a href=\"http://return.com/\"><b>Свернуть</b></a>";
        if (!msgView) text=text.substring(0,500)+"...<a href=\"http://next.com/\"><b>Читать дальше</b></a>";
        if(!TabletDetector.isTablet(getApplicationContext()))
            text = "<font size=-5>"+text+"</font>";
        webView.getSettings().setUseWideViewPort(true);
        webView.setInitialScale(1);
        String html="<html><head>\n" +
                "    <meta name=\"viewport\" content=\"width=device-width, user-scalable=no\" />\n" +
                "</head><body style=\"margin: 0px; padding: 0px;\" link=\"#781f27\">"+
                "<img align=\"left\" src=\"file:///android_res/drawable/photo_"+(indexAuthor+1)+".png\"/><p>"+text+"</p></body></html>";
        webView.loadDataWithBaseURL(null, html,"text/html", "UTF-8", null);
...
public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if (url.equals("http://next.com/")) {
                msgView=true;
                listView.setVisibility(View.GONE);
                header.setLayoutParams(longLayoutParams);
            }
            if (url.equals("http://return.com/")) {
                msgView=false;
                listView.setVisibility(View.VISIBLE);
                header.setLayoutParams(shortLayoutParams);

            }
            SetAuthorText(msgView);
            return true;
        }

wingear ★★★★ ()
Ответ на: комментарий от wingear

Звини за оффтоп... Но.

Ёк, а еще пыхеров поносят за гк. Ну что это за хренатень из конкатенации хтмл-строк с экранированием? Нельзя было вынести в какой-нить хелпер/ф-цию/шаблон? И сабстринг 500, на полуслове это тоже круто, да..

deep-purple ★★★★★ ()
Ответ на: комментарий от wingear

Само использование WebView уже считаю костылем, так что твой костыль погоды не делает. В то время когда ты замеряешь высоту хеадера контент еще грузится в отдельном потоке, потому и некорректно считается.

kazufukurou ()
Ответ на: комментарий от deep-purple

Это то, что там уже было до меня. Наверное, надо будет сделать TextView и нормальную кнопку «Свернуть/сделать как было». Хотя не известно, удастся ли её стилизовать, чтобы везде не выглядело как гиперссылка

wingear ★★★★ ()

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

RelativeLayout в этом смысле ещё хуже

WebView с wrap_content может посчитать «свою высоту» до того, как отрендерит содержимое. В зависимости от текущей производительности устройства - разный результат может быть. Ну т.е. один раз - правильно все, второй (когда в фоне сервис какой-то заработал) - другой результат. На устройствах со слабым процессором - webView бодро рапортует, шо его высота == 0 (в 99% случаев)

и при сворачивании исходная высота не восстанавливается

я правильно понял, что ты ожидаешь, что RelativeLayout пересчитает свою высоту, но этого не происходит? Попробуй requestLayout() на родителе.

но вообще - повторюсь - не делай так.

как минимум для использования webView должны быть ОЧЕНЬ веские причины

geek ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.