views:

67

answers:

1

I'm trying to just make an activity that simply loads a random image when it's loaded. It compiles fine and loads fine. But simply doesn't work. Any ideas what i'm doing wrong? It's making my eyes bleed.

------------Here my RandomImage Class --------------------------------------

package com.package.name; 

import java.util.Random; 
import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.ImageView; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View.OnClickListener; 

public class RandomImage extends Activity implements OnClickListener{ 
    private static final Random rgenerator = new Random(); 
    Integer [] mImageIds = { 
            R.drawable.pictureone, 
            R.drawable.picturetwo, 
            R.drawable.picturethree, 
            }; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.randomimage); 
    Integer q = mImageIds[rgenerator.nextInt(mImageIds.length)]; 
    ImageView iv = (ImageView) findViewById(R.id.imageviewyeah); 
    iv.setTag(q); 
    View nextButton = findViewById(R.id.next_image_button); 
    nextButton.setOnClickListener(this); 
} 

    @Override 
    public void onClick(View v) { 
    switch (v.getId()) { 
    case R.id.next_image_button: 
        Intent i = new Intent(this, RandomImage.class); 
        startActivity(i); 
        break; 
    } 
} 

    @Override 
        public boolean onCreateOptionsMenu (Menu menu) { 
                super.onCreateOptionsMenu(menu); 
                MenuInflater inflater = getMenuInflater(); 
                inflater.inflate(R.menu.menu3, menu); 
                return true; 
        } 
@Override 
public boolean onOptionsItemSelected (MenuItem item) { 
                switch (item.getItemId()) { 
                case R.id.menu: 
                        startActivity(new Intent(this, Main.class)); 
                        return true; 
} 

return false; 
        } 
}

------------Here my layout --------------------------------------

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    android:orientation="vertical" 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/widget0" 
android:background="@drawable/nhiebg" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
    android:layout_gravity="center" > 
<ImageView 
        android:id="@+id/imageviewyeah" 
        android:tag="q" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_gravity="center"> 
</ImageView> 
<Button 
        android:id="@+id/next_image_button" 
        android:text="Next Image" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:padding="10dip" 
        android:typeface="serif"/> 
</LinearLayout>

Thanks you've been a huge help, well i tried what you said. But, it just loads a random image on start, the button just does nothing. I press it then the image that was up goes away and nothing loads in its place. A whole bunch of stuff goes thru logcat, but here's the first two lines

07-17 04:15:33.102: WARN/ResourceType(30476): No package identifier when getting value for resource number 0x00000002 07-17 04:15:33.112: WARN/ImageView(30476): Unable to find resource: 2

----------------------------WHAT I HAVE NOW----------------------------

public class RandomImage extends Activity implements OnClickListener{


    private Integer [] mImageIds = { 
            R.drawable.one, 
            R.drawable.two, 
            R.drawable.three, 
            };
    private static final Random rgenerator = new Random();

    private ImageView iv;



@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.randomimage);


    Integer q = mImageIds[rgenerator.nextInt(mImageIds.length)];

    iv = (ImageView) findViewById(R.id.imageviewyeah);
    iv.setImageResource(q);


    View nextButton = findViewById(R.id.next_image_button);
    nextButton.setOnClickListener(this);

}


    @Override
    public void onClick(View v) {
    switch (v.getId()) {
    case R.id.next_image_button:
        iv.setImageResource(rgenerator.nextInt(mImageIds.length));
        break;
    }

}

I'd also like to point out, i tried removing the lines

Integer q = mImageIds[rgenerator.nextInt(mImageIds.length)];

and the line

and iv.setImageResource(q);

and it still didn't work

+2  A: 

Instead of iv.setTag(q), try using iv.setImageResource(q).


Additional improvements:

Your current method works in the sense that it displays a new random image, but it also ends up needlessly creating a new RandomImage activity, which can eat up memory and processing power (every time the button is pressed).

Here is a more efficient way; declare iv as an instance variable of your activity:

private ImageView iv;

and instantiate it in your onCreate() (just remove "ImageView"):

iv = (ImageView) findViewById(R.id.imageviewyeah);

This means you only have to set it once during your activity. Then, in onClick(), replace

Intent i = new Intent(this, RandomImage.class); 
startActivity(i); 
break; 

with

iv.setImageResource(mImageIds[rgenerator.nextInt(mImageIds.length)]);
Andy Zhang
omg that was it! I knew it was something so simple!Another thing. In your opinion do you think how i have the activity linking to itself to basically make it seem to generate a random image is this a bad idea? Would there be an easier way to make the button change the tag? It's probably a really simple thing, im just still new to java
brybam
@brybam Yes! There is an easier way. I'll edit my solution above, since there's a character limit on comments. Good luck with Java! :)
Andy Zhang
Your solution would eat memory since it would be creating lots of new activities. You could however declare it as "singletask" in your manifest. This way it will go through the activity lifecycle, but won't waste resources with extra instances of the activity. This is unnecessary for your instance, but in case you required the activity to go through oncreate, this will do that.
Falmarri
thanks you've been really helpful! I'm running into a small error tho :/ i updated my first post under the layout xml with what i'm working with now if you wouldn't mind taking a quick look at it
brybam
Hmm usually when a weird error like that comes up that has nothing to do with Java syntax, it suggests something is wrong with your xml files which is stopping Android from auto-building the project (generating the R class). If you're sure your xml is correct, try the following:- Make and undo some changes to an xml file to force a rebuild.- Check the Problems tab in Eclipse. If the error's there, right click it, delete it, and force a rebuild.- Copy your code to a new project to see if it works there.I've never experienced this myself; sorry I can't be more helpful.
Andy Zhang
Yeah looks like build problems. Try doing a "clean" and rebuild your project in eclipse. This sometimes happens when eclipse doesn't know it needs to rebuild the R class
Falmarri