将用户选择的图像中的图像位图加载到imageview中不会设置图像

时间:2019-07-08 22:07:42

标签: android bitmap imageview bitmapfactory startactivityforresult

此处是初学者

我正在将图像设置为“图像视图”,该图像将由用户选择,但是当我选择图像时,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中未显示任何内容 非常感谢您的支持...:-)

2 个答案:

答案 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()无法正常工作。

到目前为止,最好的解决方案是将GlidePicasso添加到您的项目中,然后将Uridata.getData())添加到库中以加载到您的项目中ImageView。直言不讳:任何这样做的人都需要一个很好的理由。

与当前代码最直接等效的方法是使用getContentResolver().openInputStream()InputStream所标识的内容上获取Uri。然后,使用BitmapFactory.decodeStream()填充ImageView。这将在主应用程序线程(使同等开发人员/经理感到烦恼)和冻结UI(使用户烦恼)上完成这项工作。这就是为什么您应该只使用Glide或Picasso的原因,因为它们会为您处理后台线程以及许多其他事情(例如缓存)。

相关问题