将用户选择的图像中的图像位图加载到图像视图中不会设置图像
Loading Image bitmap from user picked image into imageview doesn't set image
一个初学者这里..
我正在将图像设置到图像视图中,用户将选择该图像,但是当我选择图像时,图像视图没有加载图像。
M 应用程序正在打开文件选择器,我正在选择图像,它只是 不在 imageview 中加载选取的图像。
<ImageView
android:layout_marginRight="5dp"
android:id="@+id/logoImageView"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_gravity="center|end"
/>
在java..
ImageView logoimage=findViewById(R.id.logoImageView);
我的 Imageview 上有这个 onclick 侦听器..
logoImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent fileChoosingIntent =new Intent(Intent.ACTION_OPEN_DOCUMENT);
fileChoosingIntent.setType("image/*");
startActivityForResult(fileChoosingIntent,10);
}
});
OnActivityResults 方法
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if(resultCode==10){
logoImage.setImageBitmap(BitmapFactory.decodeFile(data.getData().getPath()));
}
}
androdi studio is giving this warning "Method invocation 'getData' may
produce 'NullPointerException'" on data.getData() method...
我也试过滑行
Glide.with(this).load(data.getData()).into(logoImage);
我得到了相同的结果,空白图像视图。
其余代码是保密的(初学者不能有密码吗?:p)
注意 - 它在 logcat 中没有显示任何内容
非常感谢您的支持...:-)
logoImage.setImageBitmap(BitmapFactory.decodeFile(data.getData().getPath()));
您没有获取文件,因此 decodeFile()
无法正常工作。
到目前为止,最好的解决方案是将 Glide or Picasso 添加到您的项目中,然后将 Uri
(data.getData()
) 提供给库以加载到您的 ImageView
.直言不讳:不这样做的任何人都需要一个很好的理由。
当前代码最直接的等价物是使用 getContentResolver().openInputStream()
获取 InputStream
由 Uri
标识的内容。然后,使用 BitmapFactory.decodeStream()
填充 ImageView
。这将在主应用程序线程上完成这项工作(激怒对等 developers/managers)并冻结您的 UI(激怒用户)。这就是为什么您应该只使用 Glide 或 Picasso,因为它们会为您处理后台线程以及许多其他事情(例如,缓存)。
您弄错了 onActivityResult
方法中的代码。 requestCode
是标识您的请求的那个。
来自 Activity
源代码:
requestCode The integer request code originally supplied to startActivityForResult()
, allowing you to identify who this result came from.
resultCode The integer result code returned by the child activity through its setResult()
.
您应该使用 resultCode
来确保您的请求成功。
当涉及到 NullPointerException
警告时,在访问其字段或方法之前,您应该始终检查所使用的可空变量实际上是否 null
。
因此您使用 Glide 的 startActivityResult()
方法应该更像这样:
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if(requestCode == 10) {
if (resultCode == RESULT_OK && data != null) {
Glide.with(this).load(data.getData()).into(logoImage);
} else {
// optional null data handling
}
}
}
一个初学者这里..
我正在将图像设置到图像视图中,用户将选择该图像,但是当我选择图像时,图像视图没有加载图像。
M 应用程序正在打开文件选择器,我正在选择图像,它只是 不在 imageview 中加载选取的图像。
<ImageView
android:layout_marginRight="5dp"
android:id="@+id/logoImageView"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_gravity="center|end"
/>
在java..
ImageView logoimage=findViewById(R.id.logoImageView);
我的 Imageview 上有这个 onclick 侦听器..
logoImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent fileChoosingIntent =new Intent(Intent.ACTION_OPEN_DOCUMENT);
fileChoosingIntent.setType("image/*");
startActivityForResult(fileChoosingIntent,10);
}
});
OnActivityResults 方法
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if(resultCode==10){
logoImage.setImageBitmap(BitmapFactory.decodeFile(data.getData().getPath()));
}
}
androdi studio is giving this warning "Method invocation 'getData' may produce 'NullPointerException'" on data.getData() method...
我也试过滑行
Glide.with(this).load(data.getData()).into(logoImage);
我得到了相同的结果,空白图像视图。
其余代码是保密的(初学者不能有密码吗?:p)
注意 - 它在 logcat 中没有显示任何内容 非常感谢您的支持...:-)
logoImage.setImageBitmap(BitmapFactory.decodeFile(data.getData().getPath()));
您没有获取文件,因此 decodeFile()
无法正常工作。
到目前为止,最好的解决方案是将 Glide or Picasso 添加到您的项目中,然后将 Uri
(data.getData()
) 提供给库以加载到您的 ImageView
.直言不讳:不这样做的任何人都需要一个很好的理由。
当前代码最直接的等价物是使用 getContentResolver().openInputStream()
获取 InputStream
由 Uri
标识的内容。然后,使用 BitmapFactory.decodeStream()
填充 ImageView
。这将在主应用程序线程上完成这项工作(激怒对等 developers/managers)并冻结您的 UI(激怒用户)。这就是为什么您应该只使用 Glide 或 Picasso,因为它们会为您处理后台线程以及许多其他事情(例如,缓存)。
您弄错了 onActivityResult
方法中的代码。 requestCode
是标识您的请求的那个。
来自 Activity
源代码:
requestCode The integer request code originally supplied to
startActivityForResult()
, allowing you to identify who this result came from.resultCode The integer result code returned by the child activity through its
setResult()
.
您应该使用 resultCode
来确保您的请求成功。
当涉及到 NullPointerException
警告时,在访问其字段或方法之前,您应该始终检查所使用的可空变量实际上是否 null
。
因此您使用 Glide 的 startActivityResult()
方法应该更像这样:
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if(requestCode == 10) {
if (resultCode == RESULT_OK && data != null) {
Glide.with(this).load(data.getData()).into(logoImage);
} else {
// optional null data handling
}
}
}