此处是初学者。
我正在将图像设置为“图像视图”,该图像将由用户选择,但是当我选择图像时,imageview不会加载图像。
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发出此警告“方法调用'getData'可能 在data.getData()方法上产生'NullPointerException'...
我也尝试过滑行
Glide.with(this).load(data.getData()).into(logoImage);
我得到相同的结果,空白的图像视图。
其余的代码是机密的(初学者不能拥有密码。.:p)
注意-它在logcat中未显示任何内容 非常感谢您的支持...:-)
答案 0 :(得分:1)
您误解了onActivityResult
方法中的代码。 requestCode
是标识您的请求的那个。
来自Activity
源代码:
requestCode 最初提供给
startActivityForResult()
的整数请求代码,可让您识别此结果的来源。resultCode 子活动通过其
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
}
}
}
答案 1 :(得分:0)
logoImage.setImageBitmap(BitmapFactory.decodeFile(data.getData().getPath()));
您没有获取文件,因此decodeFile()
无法正常工作。
到目前为止,最好的解决方案是将Glide或Picasso添加到您的项目中,然后将Uri
(data.getData()
)添加到库中以加载到您的项目中ImageView
。直言不讳:任何不这样做的人都需要一个很好的理由。
与当前代码最直接等效的方法是使用getContentResolver().openInputStream()
在InputStream
所标识的内容上获取Uri
。然后,使用BitmapFactory.decodeStream()
填充ImageView
。这将在主应用程序线程(使同等开发人员/经理感到烦恼)和冻结UI(使用户烦恼)上完成这项工作。这就是为什么您应该只使用Glide或Picasso的原因,因为它们会为您处理后台线程以及许多其他事情(例如缓存)。