2015-04-16 18 views
8

Sono abbastanza nuovo nello sviluppo di Android e ho riscontrato un problema in cui sto cercando di creare un array di immagini che viene mostrato in una galleria e quando faccio clic su un'immagine, viene mostrato il foto in basso. Quando eseguo l'app, si blocca. Qualsiasi aiuto che posso ottenere sarà molto molto utile. E grazie in anticipo.NullPointerException su getReseources() Bitmap Array

Le mie domande sono

  1. Come faccio a sbarazzarsi del NullPointerException?
  2. Sto decodificando correttamente le immagini? Qualcuno può mostrarmi un modo migliore?

Grazie

mio 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> 

mia classe:

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; 
     } 
    } 
} 

MESSAGGIO DI ERRORE:

java.lang.NullPointerException: Attempt to invoke virtual method 
'android.content.res.Resources android.content.Context.getResources() 
+0

possibile duplicato di [Che cosa è un'eccezione di puntatore nullo e come si risolve?] (Http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception-and-how -do-i-fix-it) – StackFlowed

risposta

5

1) Non è possibile accedere al proprio oggetto Contesto prima che onCreate() sia stato chiamato nella propria attività corrente. Per il modo in cui attualmente lo fai funzionare, sposta l'inizializzazione dell'array nel tuo metodo onCreate().

2) Dato che si stanno decodificando così tante immagini contemporaneamente, questo dovrebbe accadere su un thread in background. Guarda la documentazione AsyncTask per come estrarre l'immagine in un thread separato.

+0

Ok, grazie per la risposta rapida @Submersed. Darò uno scatto e ti farò sapere cosa succede ma quello che hai detto ha senso. Grazie ancora – user118742

+0

ora sto ottenendo un errore di memoria quando sposto la matrice nel blocco onCreate. Im supponendo che il processo asynctask dovrebbe risolvere quello? – user118742

+0

Quanto sono grandi le immagini che stai caricando e le hai definite correttamente in ciascuna delle cartelle disegnabili qualificate? AsyncTask non risolverà un'eccezione OutOfMemory. Ricorda che se specifichi solo i drawable nella cartella drawable senza un qualificatore, vengono considerati come mdpi, quindi verranno ridimensionati su dispositivi a più alta densità. – Submersed

Problemi correlati