如何将资源传递给库项目?

时间:2013-05-22 06:12:52

标签: android imageview

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

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

我能想到的是传递位图,但不知道如何使用项目文件夹中的图像创建位图,因为所有资源都是压缩的,我只能使用

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的布局。

您可以使用下面提供的方法将位图或drawable传递给超类中的imageview,

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

5 个答案:

答案 0 :(得分:2)

假设您在Activity类中调用它

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

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

setImageBitmap()

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

setImageResource()

ImageView.setImageResource(R.drawable.image);

setImageDrawable()

ImageView.setImageDrawable(getResources().getDrawable(R.drawable.image));

答案 3 :(得分: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

答案 4 :(得分: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);
            }
        }
    });

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