Я делаю приложение, которое в основном позволяет пользователю вводить 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();
}
}
});
Добро пожаловать в stack-overflow, сэр, пожалуйста, посетите stackoverflow.com/help/how-to-ask
Вы можете использовать findViewById(R.id.test); вне AsyncTask, но вам действительно следует использовать библиотеки Picasso или Glide для загрузки изображений из внешних источников.
вы должны использовать намерение, чтобы сначала перейти к просмотру активности, а затем показать изображение там, получив доступ к загруженному файлу по его пути на телефоне, вы не можете использовать findviewbyid, если вы не раздули родительский вид




error is here when I change id for imageview to the one in ViewActivity
Потому что вы можете найти представления, только запустив findViewById для макета, который определен для setContentView текущего действия.
Когда вы открываете новое действие, вы теряете доступ к отображаемым в нем представлениям, поэтому вы не можете их найти / использовать.
В рамках ViewActivity я бы предложил просто использовать библиотеки Picasso или Glide для загрузки изображения с URL-адреса и загрузки в R.id.pic без прохождения отдельного действия ... Если вам нужен отдельный класс, вы можете посмотреть на «Фрагменты без заголовка»
как я могу использовать Picasso для этого?
Вы ознакомились с документацией Пикассо?
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-адрес из активности загрузки?
Мне также нужно сохранить изображение в локальное хранилище.
Я обновил свой ответ. Пожалуйста, проверьте. Если вы хотите сохранить изображение локально, вы можете найти дополнительную информацию в этом вопросе SO: stackoverflow.com/questions/10388666/…
для строки Glide.with (DownloadActivity.this) .load (url) .into (imageView); Я получаю сообщение об ошибке «не удается разрешить символ imageview». Как это исправить? Я ничего не могу найти в Интернете.
Это код, который я придумал, но изображение все еще не отображается в ViewActivity. Я поместил код в правку выше.
Идентификатор вашего изображения - 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);
пожалуйста, приложите журнал ошибок