Показать изображение в TextView - PullRequest
6 голосов
/ 18 ноября 2011

Я хочу показать изображения в TextView.Мои изображения сохраняются в директории res / raw.Я пытался использовать HTML.ImageGetter, но не смог найти полную ссылку для того же.

Ответы [ 3 ]

14 голосов
/ 19 ноября 2011
import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.text.Html;
import android.text.Html.ImageGetter;
import android.widget.TextView;

public class TextImageActivity extends Activity {
    int imageNumber = 1; //int to check which image is displayed
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    TextView tvText = (TextView) findViewById(R.id.text);
    final String testContent = "<html><body><b>Test</b><i>Italic</i><br/>"
            + "<img src=\"icon.png\"/>This is like testing if this thing works" + "<img src=\"a.png\"/>" +
                    " in a more elaborate</body></html>";
    tvText.setText(Html.fromHtml(testContent, imgGetter, null));
}

  private ImageGetter imgGetter = new ImageGetter() {

    public Drawable getDrawable(String source) {
            Drawable drawable = null;
            if(imageNumber == 1) {
            drawable = getResources().getDrawable(R.raw.icon);
            ++imageNumber;
            } else drawable = getResources().getDrawable(R.raw.a);
            drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable
                                    .getIntrinsicHeight());

            return drawable;
    }
 };

 }
3 голосов
/ 18 ноября 2011

Попробуйте, чтобы вам не пришлось взламывать использование TextView. Это позволит вам учитывать произвольное количество изображений, помеченных в исходной строке. он также учитывает смежные изображения и допускает пустые начальные или конечные текстовые строки.

LinearLayout parent = //get parent layout
String input = //get input
LayoutInflater inflater = this.getLayoutInflater();
int imageIndex = input.indexOf("<image tag begin");
int endIndex = -1; //find index one past the end of the image tag
while (imageIndex > -1){
    TextView tv = inflater.inflate(R.layout.my_textview, null);
    tv.setText(input.substring(0, imageIndex));

    ImageView iv = inflater.inflate(R.layout.my_imageview, null);
    String imgTag = input.substring(imageIndex,endIndex);
    iv.setImageResource(-1); //or however you set your image from the tag

    parent.addView(tv); parent.addView(iv);

    input = input.substring(endIndex);
    }

Это должно динамически создавать все изображения, которые вам нужны, и соответствующим образом анализировать ваши входные данные. если вы хотите сохранить исходные строки в БД, это, вероятно, хорошо.

Хранение текста в текстовых представлениях и изображений в изображениях сделает вашу жизнь намного проще, если вам придется устанавливать стили / изменять атрибуты для всего, что с этим связано. Братские представления, как правило, лучше, чем взламывание неверного вида информации / слишком большого количества информации в одном элементе Layout.

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

Это было мое первоначальное решение, которое работает только с одним максимумом изображения.

String input = //whatever
boolean hasImage = //find image tag
int imageBegin = //find index where image tag begins
int imageEnd = //find index one past where image tag ends
String leadingText = input.substring(0,imageBegin);
String imageTag = input.substring(imageBegin, imageEnd);
String trailingText = input.substring(imageEnd, input.length());

((TextView)findViewById(R.id.leading_textview)).setText(leadingText);
if (hasImage){
    //use imageTag to set content of Image View)
    findViewById(R.id.image_view_id).setVisibility(View.VISIBLE);
    ((TextView)findViewById(R.id.trailing_textview)).setText(trailingText);
}

Если у вас может быть несколько встроенных изображений, вам придется динамически создавать ImageViews и конечные TextViews, и добавлять их в родитель рассматриваемого макета.

0 голосов
/ 18 ноября 2011

вы можете использовать это: setCompoundDrawablesWithIntrinsicBounds (int left, int top, int right, int bottom)

следуйте этому примеру вы можете сделать то же самое для textview

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...