Как обновить ImageView при каждом нажатии кнопки новым изображением из Интернета?

Я новичок в Android и пытаюсь создать свое первое приложение. Он должен иметь ImageView вместе с двумя кнопками (Назад и Далее). Когда пользователь нажимает кнопку «Далее», изображение в ImageView должно быть заменено следующим изображением (размещенным на моем сервере). Имена файлов 1.jpg, 2.jpg, 3.jpg... Я использую следующий код, но что-то не работает. Когда активность запускается, первое изображение загружается правильно, но когда я нажимаю кнопку «Далее», ничего не происходит (ничего также и в LogCat).

public class slidesActivity extends Activity {

private ImageView imageView;
private int imageNumber = 1;
private String plakatiUrl = "http://plakati.bg/" + 
                                 Integer.toString(imageNumber) + ".jpg";

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.slides);

    final Drawable image = LoadImageFromWeb(plakatiUrl);
    imageView = new ImageView(getBaseContext());
    imageView = (ImageView) findViewById(R.id.imageView1);
    imageView.setImageDrawable(image);

    Button nextButton = (Button) findViewById(R.id.nextBtn);
    nextButton.setOnClickListener(new View.OnClickListener() {

        public void onClick(View view) {
            imageNumber++;

            // Have to find why
            imageView.setImageDrawable(image);
            // is not working here
        }
    });

private Drawable LoadImageFromWeb(String url) {
    try {
        InputStream is = (InputStream) new URL(url).getContent();
        Drawable d = Drawable.createFromStream(is, "src name");
        return d;
    } catch (Exception e) {
        System.out.println("Exc=" + e);
        return null;
    }
}
}

Я знаю, что мне нужно сделать это в другом потоке, поэтому я не получаю ANR, но все же я что-то здесь упускаю. Может ли кто-нибудь помочь мне с этим, пожалуйста!


person Iliya Popov    schedule 07.03.2012    source источник


Ответы (2)


Это работает для меня. Зато можно почистить.

public class TestAppActivity extends Activity {

    private ImageView imageView;
    private int imageNumber = 1;
    private String plakatiUrl = "http://plakati.bg/";
    private Drawable image = null;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.slides);

        image = LoadImageFromWeb(generateUrlString(plakatiUrl, imageNumber));
        imageView = new ImageView(getBaseContext());
        imageView = (ImageView) findViewById(R.id.imageView1);
        imageView.setImageDrawable(image);

        Button nextButton = (Button) findViewById(R.id.nextBtn);
        nextButton.setOnClickListener(new View.OnClickListener() {

            public void onClick(View view) {
                imageNumber++;

                image = LoadImageFromWeb(generateUrlString(plakatiUrl, imageNumber));

                imageView.setImageDrawable(image);
            }
        });

    }

    private Drawable LoadImageFromWeb(String url) {
        Drawable d = null;

        InputStream is;
        try {
            is = (InputStream) new URL(url).getContent();
            d = Drawable.createFromStream(is, "src name");
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return d;
    }

    private String generateUrlString(String str, int n) {

        return str + Integer.toString(n) + ".jpg";
    }
}

Кроме того, я рекомендую использовать Bitmap вместо Drawable. И я заметил, что вы поместили метод LoadImageFromWeb() внутрь onCreate().

person slybloty    schedule 08.03.2012
comment
Большой !!! Это работает сейчас! Спасибо за помощь. В чем преимущество использования Bitmap вместо Drawable? - person Iliya Popov; 08.03.2012
comment
Проверьте эти ссылки: ссылка и ссылка - person slybloty; 08.03.2012

Ваш метод onClick() перезагружает одно и то же изображение при каждом касании. Вам нужно изменить свое изображение и его ссылку. Измените LoadImageFromWeb(String) на

LoadImageFromWeb(String url, int imageNumber) 
{
   String plakatiUrl = url + Integer.toString(imageNumber) + ".jpg";
   //...
}

И вызвать его из метода onClick().

person slybloty    schedule 08.03.2012
comment
Привет, спасибо за помощь. Я пробовал это, но мне все еще чего-то не хватает. Разве я не вызываю метод с помощью: imageView.setImageDrawable(image); - person Iliya Popov; 08.03.2012