Displaying Images with an Enhanced Gallery
<p>I have tried to search for solution, but I still can’t solve it and my <code>R.java</code> can’t generate <code>R.id.picture</code>. May I know where I did wrong?</p>

<pre><code>/**
 * PicSelectActivity presents image gallery - user can select new images to
 * Display within scrolling thumbnail gallery - user can select individual image
 * To display at larger size
 * 
 * Sue Smith Mobiletuts+ Tutorial - Importing and Displaying Images with the
 * Android Gallery June 2012
 */

public class FxPhoto extends Activity {

    // variable for selection intent
    private final int PICKER = 1;
    // variable to store the currently selected image
    private int currentPic = 0;
    // adapter for gallery view
    private PicAdapter imgAdapt;
    // gallery object
    private Gallery picGallery;
    // image view for larger display
    private ImageView picView;

    /**
     * instantiate the interactive gallery
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {

        /*
         * When the user clicks a thumbnail in the gallery it is displayed at
         * larger size
         * 
         * When the user long-clicks a thumbnail they are taken to their chosen
         * image selection activity, either the Android image gallery or a file
         * manager application - on returning the chosen image is displayed
         * within the thumbnail gallery and larger image view
         */

        // call superclass method and set main content view
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // get the large image view
        picView = (ImageView) findViewById(**R.id.picture**);

        // get the gallery view
        picGallery = (Gallery) findViewById(**R.id.gallery**);

        // create a new adapter
        imgAdapt = new PicAdapter(this);
        // set the gallery adapter
        picGallery.setAdapter(imgAdapt);

        // set long click listener for each gallery thumbnail item
        picGallery.setOnItemLongClickListener(new OnItemLongClickListener() {
            // handle long clicks
            public boolean onItemLongClick(AdapterView&lt;?&gt; parent, View v,
                    int position, long id) {
                // update the currently selected position so that we assign the
                // imported bitmap to correct item
                currentPic = position;
                // take the user to their chosen image selection app (gallery or
                // file manager)
                Intent pickIntent = new Intent();
                pickIntent.setType("image/*");
                pickIntent.setAction(Intent.ACTION_GET_CONTENT);
                // we will handle the returned data in onActivityResult
                startActivityForResult(
                        Intent.createChooser(pickIntent, "Select Picture"),
                        PICKER);
                return true;
            }
        });

        // set the click listener for each item in the thumbnail gallery
        picGallery.setOnItemClickListener(new OnItemClickListener() {
            // handle clicks
            public void onItemClick(AdapterView&lt;?&gt; parent, View v,
                    int position, long id) {
                // set the larger image view to display the chosen bitmap
                // calling method of adapter class
                picView.setImageBitmap(imgAdapt.getPic(position));
            }
        });
    }

    /**
     * Base Adapter subclass creates Gallery view - provides method for adding
     * new images from user selection - provides method to return bitmaps from
     * array
     * 
     */
    public class PicAdapter extends BaseAdapter {

        // use the default gallery background image
        int defaultItemBackground;

        // gallery context
        private Context galleryContext;

        // array to store bitmaps to display
        private Bitmap[] imageBitmaps;
        // placeholder bitmap for empty spaces in gallery
        Bitmap placeholder;

        // constructor
        public PicAdapter(Context c) {

            // instantiate context
            galleryContext = c;

            // create bitmap array
            imageBitmaps = new Bitmap[10];
            // decode the placeholder image
            placeholder = BitmapFactory.decodeResource(getResources(),
                    R.drawable.ic_launcher);

            // set placeholder as all thumbnail images in the gallery initially
            for (int i = 0; i &lt; imageBitmaps.length; i++)
                imageBitmaps[i] = placeholder;

            // get the styling attributes - use default Andorid system resources
            TypedArray styleAttrs = galleryContext
                    .obtainStyledAttributes(R.**styleable**.PicGallery);
            // get the background resource
            defaultItemBackground = styleAttrs.getResourceId(
                    R.**styleable**.PicGallery_android_galleryItemBackground, 0);
            // recycle attributes
            styleAttrs.recycle();
        }

        // BaseAdapter methods

        // return number of data items i.e. bitmap images
        public int getCount() {
            return imageBitmaps.length;
        }

        // return item at specified position
        public Object getItem(int position) {
            return position;
        }

        // return item ID at specified position
        public long getItemId(int position) {
            return position;
        }

        // get view specifies layout and display options for each thumbnail in
        // the gallery
        public View getView(int position, View convertView, ViewGroup parent) {

            // create the view
            ImageView imageView = new ImageView(galleryContext);
            // specify the bitmap at this position in the array
            imageView.setImageBitmap(imageBitmaps[position]);
            // set layout options
            imageView.setLayoutParams(new Gallery.LayoutParams(300, 200));
            // scale type within view area
            imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
            // set default gallery item background
            imageView.setBackgroundResource(defaultItemBackground);
            // return the view
            return imageView;
        }

        // custom methods for this app

        // helper method to add a bitmap to the gallery when the user chooses
        // one
        public void addPic(Bitmap newPic) {
            // set at currently selected index
            imageBitmaps[currentPic] = newPic;
        }

        // return bitmap at specified position for larger display
        public Bitmap getPic(int posn) {
            // return bitmap at posn index
            return imageBitmaps[posn];
        }
    }

    /**
     * Handle returning from gallery or file manager image selection - import
     * the image bitmap
     */
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        if (resultCode == RESULT_OK) {
            // check if we are returning from picture selection
            if (requestCode == PICKER) {

                // the returned picture URI
                Uri pickedUri = data.getData();

                // declare the bitmap
                Bitmap pic = null;
                // declare the path string
                String imgPath = "";

                // retrieve the string using media data
                String[] medData = { MediaStore.Images.Media.DATA };
                // query the data
                Cursor picCursor = managedQuery(pickedUri, medData, null, null,
                        null);
                if (picCursor != null) {
                    // get the path string
                    int index = picCursor
                            .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                    picCursor.moveToFirst();
                    imgPath = picCursor.getString(index);
                } else
                    imgPath = pickedUri.getPath();

                // if and else handle both choosing from gallery and from file
                // manager

                // if we have a new URI attempt to decode the image bitmap
                if (pickedUri != null) {

                    // set the width and height we want to use as maximum
                    // display
                    int targetWidth = 600;
                    int targetHeight = 400;

                    // sample the incoming image to save on memory resources

                    // create bitmap options to calculate and use sample size
                    BitmapFactory.Options bmpOptions = new BitmapFactory.Options();

                    // first decode image dimensions only - not the image bitmap
                    // itself
                    bmpOptions.inJustDecodeBounds = true;
                    BitmapFactory.decodeFile(imgPath, bmpOptions);

                    // work out what the sample size should be

                    // image width and height before sampling
                    int currHeight = bmpOptions.outHeight;
                    int currWidth = bmpOptions.outWidth;

                    // variable to store new sample size
                    int sampleSize = 1;

                    // calculate the sample size if the existing size is larger
                    // than target size
                    if (currHeight &gt; targetHeight || currWidth &gt; targetWidth) {
                        // use either width or height
                        if (currWidth &gt; currHeight)
                            sampleSize = Math.round((float) currHeight
                                    / (float) targetHeight);
                        else
                            sampleSize = Math.round((float) currWidth
                                    / (float) targetWidth);
                    }
                    // use the new sample size
                    bmpOptions.inSampleSize = sampleSize;

                    // now decode the bitmap using sample options
                    bmpOptions.inJustDecodeBounds = false;

                    // get the file as a bitmap
                    pic = BitmapFactory.decodeFile(imgPath, bmpOptions);

                    // pass bitmap to ImageAdapter to add to array
                    imgAdapt.addPic(pic);
                    // redraw the gallery thumbnails to reflect the new addition
                    picGallery.setAdapter(imgAdapt);

                    // display the newly selected image at larger size
                    picView.setImageBitmap(pic);
                    // scale options
                    picView.setScaleType(ImageView.ScaleType.FIT_CENTER);
                }
            }
        }
        // superclass method
        super.onActivityResult(requestCode, resultCode, data);
    }
}
</code></pre>
