【问题标题】:Loading Image bitmap from user picked image into imageview doesn't set image将用户选择的图像中的图像位图加载到图像视图中不会设置图像
【发布时间】:2019-11-18 10:49:01
【问题描述】:

这里是初学者..

我正在将图像设置到将由用户选择的图像视图中,但是当我选择图像时,图像视图没有加载图像。

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 中没有显示任何内容 非常感谢您的支持... :-)

【问题讨论】:

    标签: android bitmap imageview bitmapfactory startactivityforresult


    【解决方案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
                }
            }
        }
    

    【讨论】:

    • wooooooooooooohhooooooooooooooo 它起作用了...但是什么是“resultCode == RESULT_OK”我们只添加了一个 if 条件来检查 resultCode == RESULT_OK 然后它起作用了?但是如果不使用它,为什么我的代码没有工作,尽管 IF 语句的主体是相同的......我们只添加了一个条件......如何?谢谢编辑-以及该值如何为空?我们刚刚添加了一个 if 条件,并且该值现在不为空了..这是魔法吗?
    • @Monk:不,将声明 resultCode == 10 更改为 requestCode == 10 是代码工作的原因。正如我之前写的,您检查了错误的代码与您用于启动请求的代码。 resultCode == RESULT_OK 只是一种安全网,可确保您处理成功的响应。
    • 嘿,但我不检查这个然后逻辑上我的所有语句都应该运行,因为我没有任何“如果语句”..我错了吗?? :-(
    • @Monk:data 的值不是null,它可能null。如果是null,则 if 语句中的代码不会执行。在使用可空变量之前,您应该始终检查它们是否不为空,以避免 NullPointerException 导致您的应用崩溃。
    • @Monk:如果我理解正确,是的,如果您没有检查任何内容,那么代码在大多数情况下仍然可以工作。当您发出多个不同的请求或任何此请求失败时,问题就开始了。
    【解决方案2】:
    logoImage.setImageBitmap(BitmapFactory.decodeFile(data.getData().getPath()));
    

    你没有得到文件,所以decodeFile() 不起作用。

    到目前为止,最好的解决方案是将GlidePicasso 添加到您的项目中,然后将Uri (data.getData()) 提供给库以加载到您的ImageView。坦率地说:任何这样做的人都需要一个很好的理由。

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

    【讨论】:

    • androdi studio 在 data.getData() 方法上给出了这个警告“方法调用'getData'可能产生'NullPointerException'”......我也尝试过 glide Glide.with(this).load( data.getData()).into(logoImage);我得到相同的结果,空白图像视图。谢谢...
    • @Monk:查看 Logcat 看是否有来自 Glide 的消息,并查看 their debugging docs。警告只是指出,理论上,data 可能是null。在尝试使用data 之前,您应该检查resultCode 是否为RESULT_OK 以及data 是否为null
    • 嗨......它工作但如何再添加一个如果条件解决错误?我们在“If 语句”下有相同的代码,但当时它不起作用,为什么??
    猜你喜欢
    • 1970-01-01
    • 2018-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    • 2017-07-12
    • 1970-01-01
    • 2013-07-29
    相关资源
    最近更新 更多