2016-06-29 2 views
-1

Я пытаюсь показать изображение в ImageView после просмотра его с телефона в рамках метода onActivityResult. Я объявлял свой ImageView непосредственно перед методом OnCreate, после того как нашел его по его идентификатору в макете и, наконец, хочу отобразить выбранное изображение. Но imgPreview все еще серый, и я вижу сообщение «личное поле ImageView никогда не назначается». Хотя я не получаю ссылку на проблему при настройке моего растрового изображения на imgPreview внутри onActivityResult.Android: NullPointerException с ImageView.setImageBitmap

Когда я пытаюсь отлаживать это приложение, возвращаясь в основное действие из операции pickup, я получаю java.lang.NullPointerException. Если я объявила

ImageView imgPreview = (ImageView) findViewById(R.id.imageView); 

дополнительно в пределах OnActivityResult У меня нет ошибки. Можете ли вы объяснить мне, почему это происходит? Должен ли я найти imgPreview каждый раз в методе, когда я хочу его использовать? Ниже приведен фрагмент кода.

public class MainActivity extends AppCompatActivity implements TaskComplete { 

private static final int BROWSE_PIC_REQUEST_CODE = 300; 
private ImageView imgPreview; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    ImageView imgPreview = (ImageView) findViewById(R.id.imageView); 
} 


public void onClick3(View view) { 

    Intent i = new Intent(
      Intent.ACTION_PICK, 
      android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 

    startActivityForResult(i, BROWSE_PIC_REQUEST_CODE); 

} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if (requestCode == BROWSE_PIC_REQUEST_CODE && resultCode == RESULT_OK) { 

     Uri selectedImage = data.getData(); 
     String[] filePathColumn = { MediaStore.Images.Media.DATA }; 

     Cursor cursor = getContentResolver().query(selectedImage, 
       filePathColumn, null, null, null); 
     cursor.moveToFirst(); 

     int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
     String picturePath = cursor.getString(columnIndex); 
     cursor.close(); 

     BitmapFactory.Options options = new BitmapFactory.Options(); 

     options.inSampleSize = 4; 


     try { 

       imgPreview.setImageBitmap(BitmapFactory.decodeFile(picturePath,options));} 
     catch (Exception e) { 
      Log.e("test",e.toString()); 
     } 

    else { some code }; 



} 
+0

У вас есть локальная и глобальная переменная с тем же именем 'imgPreview'. Просто удалите локальную декларацию. Он должен работать нормально. –

+0

Я получил его уже. Спасибо –

+0

@KNeerajLal Переменная не имеет глобальной области (ее не public/static), это переменная экземпляра. –

ответ

2
ImageView imgPreview = (ImageView) findViewById(R.id.imageView); 

Здесь вы повторно объявить imgPreview. Удалите ImageView с начала этой строки и он должен работать. Итак:

imgPreview = (ImageView) findViewById(R.id.imageView); 

тогда будет правильно ссылаться на уровне класса imgPreview.

2

от:

ImageView imgPreview = (ImageView) findViewById(R.id.imageView); 

удалить:

ImageView 

переменная экземпляра никогда не определяется, и вы определили локальную переменную в onCreate().