2015-04-16 1 views
8

Я довольно новичок в разработке Android и столкнулся с проблемой, когда я пытаюсь создать массив изображений, который отображается в галерее, и когда я нажимаю на изображение, он показывает рис внизу. Когда я запускаю приложение, он падает. Любая помощь, которую я могу получить, будет очень полезной. И спасибо заранее.NullPointerException on getReseources() Bitmap Array

Мои вопросы

  1. Как избавиться от NullPointerException?
  2. Я правильно декодирую фотографии? Может ли кто-нибудь показать мне лучший способ?

Благодаря

Моя раскладка:

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

МОЙ КЛАСС:

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

ОШИБКА СООБЩЕНИЕ:

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

Возможный дубликат [Что такое Исключение Null Указатель и как его исправить?] (Http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception-and-how -do-i-fix-it) – StackFlowed

ответ

5

1) Вы не можете получить доступ к объекту Context до того, как onCreate() был вызван в вашей текущей деятельности. Для того, как вы сейчас работаете, просто переместите инициализацию своего массива в свой метод onCreate().

2) Поскольку вы декодируете так много изображений одновременно, это должно происходить в фоновом потоке. Посмотрите на документацию AsyncTask о том, как загрузить изображение в отдельный поток.

+0

Хорошо спасибо за быстрый ответ @Submersed. Я сделаю это и дам вам знать, что произойдет, но то, что вы сказали, имеет смысл. Еще раз спасибо – user118742

+0

Теперь я получаю ошибку из памяти, когда я перемещаю массив в блок onCreate. Я предполагаю, что процесс asynctask должен исправить это? – user118742

+0

Насколько велики изображения, которые вы загружаете, и правильно ли вы определили их в каждой из квалифицированных папок с возможностью выбора? AsyncTask не будет исправлять исключение OutOfMemory. Помните, что если вы указываете только чертежи в папке с возможностью рисования без квалификатора, они рассматриваются как mdpi, поэтому они будут расширены на устройствах с более высокой плотностью. – Submersed

 Смежные вопросы

  • Нет связанных вопросов^_^