2

我正在使用另一个项目作为库来构建 android 项目。在库项目中,它处理所有创建方法,其他项目引用该库包含自己的资源,如图像。

库项目中有一个imageView,我想做的是将图像传递给库项目进行渲染,但是,我不能只传递id,因为两个项目都有自己的资源。我试图在子项目中制作一个Drawable,并传递给父项目,结果是nullpointerexception。

我能想到的就是传bitmap,但是不知道怎么用项目文件夹里的images来创建bitmap,因为所有的资源都是压缩的,我只能用

context.getResources()

检索资源文​​件。

还是有其他方法可以做到这一点?


更新:

抱歉,NullPointerException 是因为我在调用之前尝试使用 imageview

super.onCreate();

现在它没有抛出异常并且可以运行,但是imageview仍然无法显示图像。我的代码:

ImageView imageview = (ImageView) findViewById(library.R.id.imageView1);
imageview.setImageResource(R.drawable.image);

解决方案

原来我在调用之前尝试在父类中使用imageview

super.onCreate()

并且图像无法加载,因为我

setContentView()

它涵盖了父 Activity 的布局。

您可以使用下面提供的方法将位图或可绘制对象传递给超类中的图像视图,

或者在子类中创建一个imageview,然后使用libraryPath.R获取父类中的imageview。

4

5 回答 5

2

假设您在 Activity 类中调用它

bm = BitmapFactory.decodeResource(getResources(), R.drawable.image);

第一个参数 Resources 是必需的。它通常可以在任何 Context(以及 Activity 等子类)中获得。

于 2013-05-22T06:16:02.797 回答
0

将主项目的传递context给库项目作为方法的参数。

我认为最好将位图传递给库项目而不是上下文或资源。

于 2013-05-22T06:20:33.343 回答
0

您可以拥有任意数量的库项目,但是一旦您编译并运行您的应用程序,它将是大量的代码和资源,没有什么可以将库项目中具有 ImageView 的类与您的主项目中的类区分开来一个图像视图。

发布一些显示此 ImageView 所在位置的代码。它属于哪个类,您以什么方式使用它?

访问 ImageView 后,您可以使用以下任何方法:

设置图像位图()

ImageView.setImageBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.image));

设置图像资源()

ImageView.setImageResource(R.drawable.image);

setImageDrawable()

ImageView.setImageDrawable(getResources().getDrawable(R.drawable.image));
于 2013-05-22T06:22:48.780 回答
0

我也面临同样的问题,并且有非常粗鲁的解决方案。您收到 NullPointerException是因为我认为您在 Library 项目中使用了 Switch case

根据Android library project implementation guide,在您的库项目中使用 if-else 而不是 switch case。

您可以通过单个命令直接将 switch case 转换为 if-else。您可以查看下面的文章了解更多详细信息。

http://www.tekritisoftware.com/android-library-projects-to-use-common-source-codes

于 2013-05-22T06:30:41.647 回答
0

私有位图 imageOriginal, imageScaled;

if (imageOriginal == null) { imageOriginal = BitmapFactory.decodeResource(context.getResources(), drawable_id); }

    image.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            // method called multiple times but we can initialize just once
            if (imageHeight == 0 || imageWidth == 0) {
                imageHeight = image.getHeight();
                imageWidth = image.getWidth();
                // resize the image
                Matrix resize = new Matrix();
                resize.postScale((float) Math.min(imageWidth, imageHeight) / (float) imageOriginal.getWidth(), (float) Math.min(imageWidth, imageHeight) / (float) imageOriginal.getHeight());
                imageScaled = Bitmap.createBitmap(imageOriginal, 0, 0, imageOriginal.getWidth(), imageOriginal.getHeight(), resize, false);
                // translate the matrix to the image view's center
                float translateX = imageWidth / 2 - imageScaled.getWidth() / 2;
                float translateY = imageHeight / 2 - imageScaled.getHeight() / 2;
                matrix.postTranslate(translateX, translateY);
                image.setImageBitmap(imageScaled);
                image.setImageMatrix(matrix);
            }
        }
    });

这会将图像类型更改为位图。我希望它会帮助你。

于 2013-05-22T07:05:55.097 回答