Приложение вылетает, когда я пытаюсь отобразить изображение в просмотре изображения в другом действии

Я делаю приложение, которое в основном позволяет пользователю вводить URL-адрес вместе с заголовком в тексте редактирования, а затем, нажав кнопку загрузки, изображение будет отображаться в другом действии. Есть и другие функции, которые сейчас не актуальны. Проблема, с которой я столкнулся, заключается в том, что когда я ввожу идентификатор для просмотра изображения, из которого должно отображаться загруженное изображение, и нажимаю кнопку загрузки для изображения, приложение вылетает. Это мой код на данный момент:

Основная деятельность:

package com.example.faraz.assignment2;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void dl(View view) {
        Intent intent = new Intent(this,DownloadActivity.class);
        startActivity(intent);
    }

    public void viewA(View view) {
        Intent viewPic = new Intent(this,ViewActivity.class);
        startActivity(viewPic);
    }
}

Основной XML:

<?xml version = "1.0" encoding = "utf-8"?>
<android.widget.LinearLayout 
    xmlns:android = "http://schemas.android.com/apk/res/android"
    xmlns:app = "http://schemas.android.com/apk/res-auto"
    xmlns:tools = "http://schemas.android.com/tools"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    android:gravity = "top|center_vertical|center_horizontal|center"
    android:orientation = "vertical"
    tools:context = ".MainActivity">

    <Button
        android:id = "@+id/download"
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content"
        android:text = "Download"
        android:onClick = "dl"/>

    <Button
        android:id = "@+id/delete"
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content"
        android:text = "Delete" />

    <Button
        android:id = "@+id/view"
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content"
        android:text = "View"
        android:onClick = "viewA"/>

    <Button
        android:id = "@+id/range"
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content"
        android:text = "Range" />
</android.widget.LinearLayout>

ViewActivity - это то место, где я пытаюсь отобразить изображение:

package com.example.faraz.assignment2;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class ViewActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view);
    }
}

ViewActivity XML:

<?xml version = "1.0" encoding = "utf-8"?>
<android.widget.LinearLayout 
    xmlns:android = "http://schemas.android.com/apk/res/android"
    xmlns:app = "http://schemas.android.com/apk/res-auto"
    xmlns:tools = "http://schemas.android.com/tools"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    android:gravity = "top|center_vertical|center_horizontal|center"
    android:orientation = "vertical"
    tools:context = ".DownloadActivity">


    <ImageView
        android:id = "@+id/pic"
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content"
        tools:srcCompat = "@tools:sample/avatars[0]" />
</android.widget.LinearLayout>

DownloadActivity - это место, откуда загружается изображение:

package com.example.faraz.assignment2;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;

import java.io.BufferedInputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;


public class DownloadActivity extends AppCompatActivity {

    private Button btn;
    private EditText et;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_download);

        btn = (Button)findViewById(R.id.buttonD);
        et = (EditText)findViewById(R.id.link);

        btn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                try {
                    URL url = new URL(et.getText().toString());
                    new MyDownloadTask().execute(url);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    private class MyDownloadTask extends AsyncTask<URL, Integer, Bitmap> {
        @Override
        protected Bitmap doInBackground(URL... params) {
            URL url = params[0];
            Bitmap bitmap = null;
            try {
                URLConnection connection = url.openConnection();
                connection.connect();
                InputStream is = connection.getInputStream();
                BufferedInputStream bis = new BufferedInputStream(is);
                bitmap = BitmapFactory.decodeStream(bis);
                bis.close();
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }

            return bitmap;
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            if (bitmap != null) {
                ImageView myImage = (ImageView) findViewById(R.id.test);//error is here when I change id for imageview to the one in ViewActivity
                myImage.setImageBitmap(bitmap);
            } else {
                Toast.makeText(getApplicationContext(), "Failed to Download 
Image", Toast.LENGTH_LONG).show();
            }
        }
    }
}

Код активности загрузки взят из здесь

DownloadActivity XML:

<?xml version = "1.0" encoding = "utf-8"?>
<android.widget.LinearLayout 
    xmlns:android = "http://schemas.android.com/apk/res/android"
    xmlns:app = "http://schemas.android.com/apk/res-auto"
    xmlns:tools = "http://schemas.android.com/tools"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    android:id = "@+id/linear_layout"
    android:gravity = "top|center_vertical|center_horizontal|center"
    android:orientation = "vertical"
    tools:context = ".DownloadActivity">


    <EditText
        android:id = "@+id/link"
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content"
        android:ems = "10"
        android:hint = "URL"
        android:inputType = "textPersonName" />

    <EditText
        android:id = "@+id/title"
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content"
        android:ems = "10"
        android:hint = "Title"
        android:inputType = "textPersonName" />

    <Button
        android:id = "@+id/buttonD"
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content"
        android:text = "Download" />

    <ImageView
        android:id = "@+id/test"
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content"
        tools:srcCompat = "@tools:sample/avatars" />
</android.widget.LinearLayout>

Буду признателен за помощь.

Редактировать: Сейчас это моя DownloadActivity, но она по-прежнему не отображает изображение на ViewActivity:

btn = (Button)findViewById(R.id.buttonD);
et = (EditText)findViewById(R.id.link);
pic = (ImageView) findViewById(R.id.pic);


    btn.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            try {
                String url = et.getText().toString();
                Glide.with(DownloadActivity.this).load(url).into(pic);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });

пожалуйста, приложите журнал ошибок

Ashvin solanki 04.11.2018 07:07

Добро пожаловать в stack-overflow, сэр, пожалуйста, посетите stackoverflow.com/help/how-to-ask

Ashvin solanki 04.11.2018 07:09

Вы можете использовать findViewById(R.id.test); вне AsyncTask, но вам действительно следует использовать библиотеки Picasso или Glide для загрузки изображений из внешних источников.

OneCricketeer 04.11.2018 07:17

вы должны использовать намерение, чтобы сначала перейти к просмотру активности, а затем показать изображение там, получив доступ к загруженному файлу по его пути на телефоне, вы не можете использовать findviewbyid, если вы не раздули родительский вид

masoud vali 04.11.2018 07:23
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
76
3

Ответы 3

error is here when I change id for imageview to the one in ViewActivity

Потому что вы можете найти представления, только запустив findViewById для макета, который определен для setContentView текущего действия.

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


В рамках ViewActivity я бы предложил просто использовать библиотеки Picasso или Glide для загрузки изображения с URL-адреса и загрузки в R.id.pic без прохождения отдельного действия ... Если вам нужен отдельный класс, вы можете посмотреть на «Фрагменты без заголовка»

как я могу использовать Picasso для этого?

frashid99 05.11.2018 04:12

Вы ознакомились с документацией Пикассо?

OneCricketeer 05.11.2018 06:42

runOnUiThread

added in API level 1

public final void runOnUiThread (Runnable action) Runs the specified action on the UI thread. If the current thread is the UI thread, then the action is executed immediately. If the current thread is not the UI thread, the action is posted to the event queue of the UI thread.

DownloadActivity.this.runOnUiThread(new Runnable() 
    {
        public void run() {
            Log.d("UI thread", "I am the UI thread");
                         if (bitmap != null) {
                                      //remove line from here ImageView myImage = (ImageView)findViewById(R.id.test);
              //error is here when I change id for imageview to the one in ViewActivity
                    myImage.setImageBitmap(bitmap);
                                             } else {
                                          Toast.makeText(getApplicationContext(), "Failed to Download 
    Image", Toast.LENGTH_LONG).show();
                                                    }
                         }
    });

Редактировать 2

ImageView myImage = (ImageView) findViewById(R.id.test);

пожалуйста, инициализируйте onCreate ();

заменить

ImageView myImage;

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_download);

    btn = (Button)findViewById(R.id.buttonD);
    et = (EditText)findViewById(R.id.link);

    // myImage Initialization 
    myImage = (ImageView) findViewById(R.id.test);


    btn.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            try {
                URL url = new URL(et.getText().toString());
                new MyDownloadTask().execute(url);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

Это можно легко сделать с меньшими строками кода. Сначала на вашем MainActivity получите URL-адрес изображения от пользователя и передайте его на ваш DownloadActivity, используя bundle и intent. Нравится:

EditText urledititext = findViewById(R.id.url);
String url = urledititext .getText().toString();
Intent intent = new Intent(this,DownloadActivity.class);
intent.putExtra("url", url);
startActivity(intent);

Вот как вы можете отправить строковый URL-адрес на DownloadActivity.

В процессе загрузки просто получите пакет и, используя библиотеку glide, вы можете получить изображение с URL-адреса и загрузить в свой imageview. Нравится :

String url= bundle.getString("url");
Glide.with(DownloadActivity.this).load(url).into(imageView);

Не забудьте добавить библиотеку скольжения на уровне вашего приложения build.gradle следующим образом:

implementation 'com.github.bumptech.glide:glide:4.8.0'

Обновление 1:

Если вы хотите отправить данные из одного действия в другое, используйте описанный выше метод. Если вы получаете URL-адрес и показываете изображение в одном действии, выполните следующие действия:

В вашем DownloadActivity:

    btn = (Button)findViewById(R.id.buttonD);
    et = (EditText)findViewById(R.id.link);

    btn.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            try {
                String url = et.getText().toString();
                Glide.with(DownloadActivity.this).load(url).into(imageView);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });

Приведенный выше код получит строку URL-адреса из edittext et, а библиотека Glide загрузит и покажет изображение за URL-адресом.

Мне нужно получить URL-адрес из активности загрузки, а не из основного, поскольку это часть задания. Как мне это сделать, получив URL-адрес из активности загрузки?

frashid99 05.11.2018 03:17

Мне также нужно сохранить изображение в локальное хранилище.

frashid99 05.11.2018 05:09

Я обновил свой ответ. Пожалуйста, проверьте. Если вы хотите сохранить изображение локально, вы можете найти дополнительную информацию в этом вопросе SO: stackoverflow.com/questions/10388666/…

Karthic Srinivasan 05.11.2018 09:24

для строки Glide.with (DownloadActivity.this) .load (url) .into (imageView); Я получаю сообщение об ошибке «не удается разрешить символ imageview». Как это исправить? Я ничего не могу найти в Интернете.

frashid99 06.11.2018 04:21

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

frashid99 06.11.2018 05:34

Идентификатор вашего изображения - test, как вы упомянули в этой строке, - android:id = "@+id/test. Но вы найдете imageview с идентификатором pic в этой строке - pic = (ImageView) findViewById(R.id.pic);. Очевидно, это не сработает. Просто измените эту строку pic = (ImageView) findViewById(R.id.pic); на ImageView pic = findViewById(R.id.test);

Karthic Srinivasan 06.11.2018 06:19

Другие вопросы по теме