Android 以编程方式将图像加载到图层列表中

Android 以编程方式将图像加载到图层列表中,android,Android,我试图通过编程将图像加载到图层列表中。我找到了一些解决办法,但不知怎么的,它不起作用。以下是我所做的: layer_list.xml:(设置为RelativeLayout的背景) 但不知何故,占位符图像永远不会被新位图替换。我做错了什么 编辑:这是我加载图像的方式: private void loadImageIntoLayerList(Context context, String url) { // To get image using Fresco ImageReq

我试图通过编程将图像加载到图层列表中。我找到了一些解决办法,但不知怎么的,它不起作用。以下是我所做的:

layer_list.xml:(设置为RelativeLayout的背景)

但不知何故,占位符图像永远不会被新位图替换。我做错了什么

编辑:这是我加载图像的方式:

    private void loadImageIntoLayerList(Context context, String url) {
    // To get image using Fresco
    ImageRequest imageRequest = ImageRequestBuilder
            .newBuilderWithSource(Uri.parse(url))
            .setProgressiveRenderingEnabled(true)
            .build();

    ImagePipeline imagePipeline = Fresco.getImagePipeline();
    DataSource<CloseableReference<CloseableImage>> dataSource = imagePipeline
            .fetchDecodedImage(imageRequest, context);

    BaseBitmapDataSubscriber dataSubscriber = new BaseBitmapDataSubscriber() {
        @Override
        public void onNewResultImpl(@Nullable Bitmap bitmap) {
            // You can use the bitmap in only limited ways
            // No need to do any cleanup.
            if (bitmap != null) {
                Drawable drawable = new BitmapDrawable(getResources(), bmp);
                LayerDrawable layerDrawable = (LayerDrawable) ResourcesCompat.getDrawable
                        (getResources(), R.drawable.layer_list, null);
                if (layerDrawable != null) {
                    layerDrawable.setDrawableByLayerId(R.id.cover_image, drawable);
                    header.setBackground(layerDrawable);
                }
            }
        }

        @Override
        public void onFailureImpl(DataSource dataSource) {
            // No cleanup required here.
        }
    };
    dataSource.subscribe(dataSubscriber, CallerThreadExecutor.getInstance());
private void loadImageIntoLayerList(上下文,字符串url){
//利用湿壁画获取图像
ImageRequest ImageRequest=ImageRequestBuilder
.newBuilderWithSource(Uri.parse(url))
.SetProgressiveEnderingEnabled(真)
.build();
ImagePipeline ImagePipeline=Fresco.getImagePipeline();
DataSource DataSource=imagePipeline
.fetchDecodedImage(图像请求、上下文);
BaseBitmapDataSubscriber dataSubscriber=新BaseBitmapDataSubscriber(){
@凌驾
public void onNewResultImpl(@Nullable位图){
//只能以有限的方式使用位图
//不需要做任何清理。
if(位图!=null){
Drawable Drawable=新的位图Drawable(getResources(),bmp);
LayerDrawable LayerDrawable=(LayerDrawable)ResourcesCompat.getDrawable
(getResources(),R.drawable.layer_list,null);
if(layerDrawable!=null){
layerDrawable.setDrawableByLayerId(R.id.cover_图像,可绘制);
收割台.立根台(可分层绘制);
}
}
}
@凌驾
public void onFailureImpl(数据源数据源){
//这里不需要清理。
}
};
subscribe(dataSubscriber,callerReadExecutor.getInstance());

在末尾添加以下行:

myRelativeLayout.setBackground(layerDrawable);
看起来您需要在更改drawable后再次设置背景

以下是工作代码:

public class TestActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test);
    final RelativeLayout RL = (RelativeLayout) findViewById(R.id.RL);
    Button btn = (Button) findViewById(R.id.btn);
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Drawable drawable = ResourcesCompat.getDrawable(getResources(), R.drawable.image7, null);
            LayerDrawable layerDrawable = (LayerDrawable) ResourcesCompat.getDrawable(getResources(), R.drawable.layer_list, null);
            layerDrawable.setDrawableByLayerId(R.id.replace, drawable);
            RL.setBackground(layerDrawable);

        }
    });
}
}

layer_list.xml与您的相同,只是具有不同的绘图表。activity_test.xml只是一个中间有一个按钮的相对性窗口。

您不能使用在
BaseBitmapDataSubscriber.onnerResultImpl(位图)
中获得的位图进行此操作。 如果您查看此方法的示例,您会看到位图的内存不久将被释放

如果您在布局中直接使用
SimpleDraweView
会更好。它支持覆盖、背景和占位符,因此可以为您处理所有事情。 您可以将图层列表拆分为单独的绘图表,例如背景和覆盖,并用XML或代码进行设置。 然后只需执行
draweeView.setImageURI(…)
即可加载图像

您还可以为此获取可绘制文件(例如,将其设置为背景,因为您可以根据自定义视图指南使用
drawable drawable=mDraweeHolder.gettoplaveldrawable();
获取可绘制文件本身)

如果您确实必须直接使用imagepipeline,还必须正确处理位图的生命周期。您将获得位图的
CloseableReference
,并且必须手动释放它。
查看以获取更多信息。您还可以查看像和这样的类,以了解如何实现这一点(这是使用SimpleDraweView时发生的情况)。

您看过这篇文章了吗?也许可以将android:drawable=“@drawable/placeholder”替换为,并在代码中,将位图替换为:layerDrawable.draw(新画布)(位图))尝试了这两种方法,可绘制的仍没有被替换…将最后一行修改为boolean check=layerDrawable.setDrawableByLayerId(R.id.replace,drawable);查看日志记录时代码的该部分是否有问题,检查它是否不返回任何内容。您如何命名可绘制的“层列表”?不允许使用“-”在名称中。也许这是你的问题?因为我使用的代码与你的代码相同,有一个名为“layer_list”的可绘制代码我的正在工作。你如何称呼这个图像替换代码?它是一个带下划线的名称,没有破折号。我正在使用Fresco图像管道从图像url中获取位图,并在回调中进行图像替换。因此,首先尝试一些简单的方法:在屏幕上添加一个普通的RelativeLayout,然后简单地更改其背景这是你收到的位图。如果它工作正常,那么你的位图就可以了。我会用我的工作代码编辑我的答案,这样你就可以修改它来解决这个问题。我添加了图像加载和替换的代码从未使用过Fresco,因此无法进一步帮助。请注意,我的工作代码在我重新设置背景后就开始工作了。所以请尝试解决这个问题,祝你好运。
myRelativeLayout.setBackground(layerDrawable);
public class TestActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test);
    final RelativeLayout RL = (RelativeLayout) findViewById(R.id.RL);
    Button btn = (Button) findViewById(R.id.btn);
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Drawable drawable = ResourcesCompat.getDrawable(getResources(), R.drawable.image7, null);
            LayerDrawable layerDrawable = (LayerDrawable) ResourcesCompat.getDrawable(getResources(), R.drawable.layer_list, null);
            layerDrawable.setDrawableByLayerId(R.id.replace, drawable);
            RL.setBackground(layerDrawable);

        }
    });
}
}