Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NullPointerException on getReseources() Bitmap Array

I'm am fairly new to android development and ran into an issue where I am trying to create an image array that shows in a gallery and when I click on a picture, it shows the the pic at the bottom. When I run the app, it crashes. Any help i can get will be very very helpful. And thanks in advance.

My questions are

  1. How do I get rid of the NullPointerException?
  2. I'm I decoding the pictures correctly? Can someone show me a better way?

Thanks

My layout:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".PicturesActivity" >

    <Gallery
        android:id="@+id/gallery1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_marginTop="16dp" />

    <ImageView
        android:id="@+id/image1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/trophykiss" />

</RelativeLayout>

MY CLASS:

public class PicturesActivity extends Activity {   

    Bitmap[] myImages = new Bitmap[] {
         BitmapFactory.decodeResource(getResources(), R.drawable.champions),
         BitmapFactory.decodeResource(getResources(), R.drawable.trophykiss),
         BitmapFactory.decodeResource(getResources(), R.drawable.championstwo),
         BitmapFactory.decodeResource(getResources(), R.drawable.trophies),
         BitmapFactory.decodeResource(getResources(), R.drawable.culture),
         BitmapFactory.decodeResource(getResources(), R.drawable.maintrophy),
         BitmapFactory.decodeResource(getResources(), R.drawable.dive),
         BitmapFactory.decodeResource(getResources(), R.drawable.naijamain),
         BitmapFactory.decodeResource(getResources(), R.drawable.ethiopia),
         BitmapFactory.decodeResource(getResources(), R.drawable.peru),
         BitmapFactory.decodeResource(getResources(), R.drawable.funtime),
         BitmapFactory.decodeResource(getResources(), R.drawable.skils),
         BitmapFactory.decodeResource(getResources(), R.drawable.gabon),
         BitmapFactory.decodeResource(getResources(), R.drawable.gambia),
         BitmapFactory.decodeResource(getResources(), R.drawable.guinea)
    };


    private ImageView imageView;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pictures);

        Gallery g = (Gallery) findViewById(R.id.gallery1);
        g.setAdapter(new ImageAdapter(this));
        imageView = (ImageView) findViewById(R.id.image1);



                g.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View v,
                                    int position, long id) {
                // TODO Auto-generated method stub
                Toast.makeText(getApplicationContext(), "pic: " + position,
                        Toast.LENGTH_SHORT).show();
                imageView.setImageBitmap(myImages[position]);

            }



        });
    }

    public class ImageAdapter extends BaseAdapter {
        int mGalleryItemBackground;
        private Context mContext;

        public ImageAdapter(Context c) {
            mContext = c;
            TypedArray a = obtainStyledAttributes(R.styleable.MyGallery);
            mGalleryItemBackground = a.getResourceId(
                    R.styleable.MyGallery_android_galleryItemBackground, 0);
            a.recycle();
        }

        public int getCount() {
            return myImages.length;
        }

        public Object getItem(int position) {
            return position;
        }

        public long getItemId(int position) {
            return position;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            ImageView i = new ImageView(mContext);


            i.setImageBitmap(myImages[position]);
            i.setLayoutParams(new Gallery.LayoutParams(200, 200));
            i.setScaleType(ImageView.ScaleType.FIT_XY);
            i.setBackgroundResource(mGalleryItemBackground);

            return i;
        }
    }
}

ERROR MESSAGE:

java.lang.NullPointerException: Attempt to invoke virtual method 
'android.content.res.Resources android.content.Context.getResources()
like image 899
Toye Avatar asked Apr 16 '15 14:04

Toye


1 Answers

1) You can't access your Context object before onCreate() has been called in your current activity. For the way you currently have it to work, just move the initialization of your array into your onCreate() method.

2) Since you're decoding so many images at once, this should happen on a background thread. Look at the AsyncTask documentation for how to pull the image loading out into a separate thread.

like image 157
Submersed Avatar answered Oct 22 '22 09:10

Submersed