Динамическое построение Лэйаута

Интерфейс, диалоги, темы, стили, меню
Аватара пользователя
kondra007
Сообщения: 91
Зарегистрирован: 23 янв 2013, 14:49

Динамическое построение Лэйаута

Сообщение kondra007 » 21 янв 2014, 18:46

Здравствуйте. В приложении парсится некоторая страница. Предположим, какой-то пост из блога. Он может идти сплошным текстом, а иногда в нем встречаются картинки.
Вопрос #1: как сделать вывод WebView без горизонтальной прокрутки (чтоб всё отображалось в пределах одного экрана)?

Вопрос #2: WebView я не хочу делать. Так некрасиво. Предположим, я могу в тексте найти изображения, как сделать так, чтобы при загрузке динамически создавались TextView с текстом ДО изображения, ImageView с самим изображением, затем TextView с текстом ПОСЛЕ изображения?

Надеюсь, идея понятна.
Вот, как это должно выглядеть
Изображение
Изображение

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Динамическое построение Лэйаута

Сообщение anber » 21 янв 2014, 19:10

Вопрос #2: WebView я не хочу делать. Так некрасиво. Предположим, я могу в тексте найти изображения, как сделать так, чтобы при загрузке динамически создавались TextView с текстом ДО изображения, ImageView с самим изображением, затем TextView с текстом ПОСЛЕ изображения?
Берешь LinearLayout,
создаешь TextView, делаешь ему что-то типа setText(HTML.fromHTML(text)), добавляешь на LinearLayout,
потом создаешь ImageView, запихиваешь туда картинку, добавляешь, итд.
Глянь тут тут может понадобится.

по поводу вопрос №1:
http://stackoverflow.com/questions/1106 ... id-webview
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Аватара пользователя
kondra007
Сообщения: 91
Зарегистрирован: 23 янв 2013, 14:49

Re: Динамическое построение Лэйаута

Сообщение kondra007 » 21 янв 2014, 19:14

anber писал(а): Глянут тут может понадобится.
Вчера видел этот пример. Вылетает с ошибкой NullPointerException в этой строке

Код: Выделить всё

urlDrawable.setBounds(0, 0, 0 + result.getIntrinsicWidth(), 0 
Поэтому проверить не получается(

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Динамическое построение Лэйаута

Сообщение anber » 21 янв 2014, 19:22

Вчера видел этот пример. Вылетает с ошибкой NullPointerException в этой строке
Есть идеи почему оно падает? :lol:
Наводящий вопрос - где находится картинка из примера:
Изображение
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Аватара пользователя
kondra007
Сообщения: 91
Зарегистрирован: 23 янв 2013, 14:49

Re: Динамическое построение Лэйаута

Сообщение kondra007 » 21 янв 2014, 19:27

anber писал(а): Наводящий вопрос - где находится картинка из примера:
а) В интернете
б) Ну, на Gravatar.com

Если вы про AsyncTask, то он там есть) Но и моя кастомная строка

Код: Выделить всё

String html1 = "Hello" + "<img src=\"https://pp.vk.me/c10716/u121500512/-6/x_7e78b984.jpg\">" + "Test!";
Выдает ту же ошибку. Проблема в result.getIntrinsicWidth() и result.getIntrinsicHeight() (валится даже на выводе переменных в лог).

Если я неправильно Вас понял - поправьте, пожалуйста. Я быдлокодер и многого могу не понимать.

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Динамическое построение Лэйаута

Сообщение anber » 21 янв 2014, 19:35

а) у меня все работает
б) <uses-permission android:name="android.permission.INTERNET" />
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Аватара пользователя
kondra007
Сообщения: 91
Зарегистрирован: 23 янв 2013, 14:49

Re: Динамическое построение Лэйаута

Сообщение kondra007 » 21 янв 2014, 19:41

Ох...да, тупанул :(
Спасибо!

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Динамическое построение Лэйаута

Сообщение anber » 21 янв 2014, 20:00

Если надо изображения побольше -
String html = "Hello " +
"<img src='http://www.gravatar.com/avatar/" +
"f9dd8b16d54f483f22c0b7a7e3d840f9?s=1024&d=identicon&r=PG'/>" +
" This is a test " +
"<img src='http://www.gravatar.com/avatar/a9317e7f ... ticon&r=PG'/>";
Если есть проблема с размером изображений - http://stackoverflow.com/questions/7870 ... 4#10208504
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Динамическое построение Лэйаута

Сообщение anber » 21 янв 2014, 20:33

Да, вспомнил, есть еще чудная библотека для обтекания текстом картинок - https://code.google.com/p/android-flowtextview/

Изображение
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Аватара пользователя
kondra007
Сообщения: 91
Зарегистрирован: 23 янв 2013, 14:49

Re: Динамическое построение Лэйаута

Сообщение kondra007 » 21 янв 2014, 20:36

anber писал(а):Если надо изображения побольше -
Если есть проблема с размером изображений - http://stackoverflow.com/questions/7870 ... 4#10208504

Че-то не работает. Эклипс требует поменять SetHeight на SetMinimumHeight, при этом ничего не меняется =(

А насчет библиотеки - судя по тому, что я прочитал, она просто будет окаймлять уже готовые ImageView, а не вставлять картинки в один TextView...

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Динамическое построение Лэйаута

Сообщение anber » 21 янв 2014, 20:43

там в начале поста написано "You could change your cointainer c (view) to a textView"
А насчет библиотеки - судя по тому, что я прочитал, она просто будет окаймлять уже готовые ImageView, а не вставлять картинки в один TextView...
да, но в 1 посте так и планировалось, с той разнице что ImageView будут между несколькими textView
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Аватара пользователя
kondra007
Сообщения: 91
Зарегистрирован: 23 янв 2013, 14:49

Re: Динамическое построение Лэйаута

Сообщение kondra007 » 21 янв 2014, 20:51

Поменял. В логах ширина и высота выводятся по размеру экрана, а на дисплее - маленький квадрат х_х

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Динамическое построение Лэйаута

Сообщение anber » 21 янв 2014, 21:40

Держи пример во вложении. Пробую коннектиться к http://anber.dp.ua/files/test.html (за доступность сайта не ручаюсь :lol: )
Вложения
ExtractHtmlImages.zip
(41.96 КБ) 245 скачиваний
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Аватара пользователя
kondra007
Сообщения: 91
Зарегистрирован: 23 янв 2013, 14:49

Re: Динамическое построение Лэйаута

Сообщение kondra007 » 21 янв 2014, 21:46

Эм...ну, вот как на Galaxy S4 отображается. Правда, тут экран 1080х1920, может, проблема в этом?
Вложения
Screenshot_2014-01-21-22-44-10.png
Screenshot_2014-01-21-22-44-10.png (1.11 МБ) 9812 просмотров

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Динамическое построение Лэйаута

Сообщение anber » 21 янв 2014, 21:50

Ты хочешь чтобы картинки были выровнены по центру и текст был только между картинками?
Тогда добавь в исходный html тег <br/> до и после картинок.

Или в чем проблема?
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Аватара пользователя
kondra007
Сообщения: 91
Зарегистрирован: 23 янв 2013, 14:49

Re: Динамическое построение Лэйаута

Сообщение kondra007 » 21 янв 2014, 22:10

С < br > проблемы нет, это я исправлю. А как можно сделать, чтоб изображение вытягивалось пропорционально какой-то части экрана?
А то на Galaxy S2 изображение получается в половину ширины дисплея, а на S4 - меньше, чем на четверть. При этом высота вообще какая-то сверхмелкая, узкая полоса выходит.

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Динамическое построение Лэйаута

Сообщение anber » 21 янв 2014, 22:40

Ну если закрыть глаза и писать левой ногой, то это можно сделать так, заменить метод fetchDrawable() в классе URLImageParser на такой:
(скалит дроваблу по ширине TextView)

Код: Выделить всё

    public Drawable fetchDrawable(String urlString) {
      try {
        InputStream is = fetch(urlString);
        Drawable drawable = Drawable.createFromStream(is, "src");
        if (drawable == null) {
          return null;
        }
        if (drawable instanceof BitmapDrawable) {
          Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();

          final int maxSize = container.getWidth();
          int outWidth;
          int outHeight;
          int inWidth = bitmap.getWidth();
          int inHeight = bitmap.getHeight();
          if(inWidth > inHeight){
            outWidth = maxSize;
            outHeight = (inHeight * maxSize) / inWidth;
          } else {
            outHeight = maxSize;
            outWidth = (inWidth * maxSize) / inHeight;
          }

          Bitmap resizedBitmap = Bitmap.createScaledBitmap(bitmap, outWidth, outHeight, false);

          drawable = new BitmapDrawable(c.getResources(), resizedBitmap);
        }
        drawable.setBounds(0, 0, 0 + drawable.getIntrinsicWidth(), 0 + drawable.getIntrinsicHeight());
        return drawable;
      } catch (Exception e) {
        return null;
      }
    }
P.S. это первая попавшаяся под руку реализация так что сильно не пинать :D
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Аватара пользователя
kondra007
Сообщения: 91
Зарегистрирован: 23 янв 2013, 14:49

Re: Динамическое построение Лэйаута

Сообщение kondra007 » 22 янв 2014, 02:08

Спасибо огромное!
И, пожалуй, последняя проблема, которая меня мучает: если картинка не помещается во весь экран (по ширине умещается, а по высоте уже нет), то она просто обрезается и ScrollView на это не реагирует. Пробовал поставить после всего текста точку, чтоб ScrollView до неё скроллил - не работает.

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Динамическое построение Лэйаута

Сообщение anber » 22 янв 2014, 15:49

пример такой HTML можешь привести?
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Аватара пользователя
kondra007
Сообщения: 91
Зарегистрирован: 23 янв 2013, 14:49

Re: Динамическое построение Лэйаута

Сообщение kondra007 » 22 янв 2014, 15:56

Код: Выделить всё

<p><img src="https://dl.dropboxusercontent.com/u/46812822/Yandex-Disk-besplatniy-servis-dlya-khraneniya-vashikh-faylov-066.jpg" alt=""/></p> .
(там ещё точка после последнего тега)

Вот 2 скриншота - 1) http://yadi.sk/d/Cv1WKA2pGXbxe 2) http://yadi.sk/d/NkpLjid4GXc2b
Видно, что нижняя часть (зеленая трава) в альбомной ориентации уже не вмещается, однако скролл не действует.

Ответить